$max
定义
$max
指定
$max
值以指定特定索引的排他性上限,从而约束find()
的结果。$max
按顺序指定特定索引的所有键的上限。db.collection.find( { <query> } ).max( { field1: <max value>, ... fieldN: <max valueN> } ) 您还可以使用以下两种形式指定
$max
:db.collection.find( { <query> } )._addSpecial( "$max", { field1: <max value1>, ... fieldN: <max valueN> } ) db.collection.find( { $query: { <query> }, $max: { field1: <max value1>, ... fieldN: <max valueN> } } )
行为
与索引选择进行交互
由于max()
需要字段上的索引,并强制查询使用此索引,因此如果可能,您可能更愿意使用$lt
操作符进行查询。 考虑以下示例:
db.collection.find( { _id: { $in: [ 6, 7 ] } } ).max( { age: 25 } ).hint( { age: 1 } )
查询使用age
字段上的索引,即使_id
上的索引可能更好。
索引边界
$max
指定的边界必须大于$min
指定的边界。4.0 版本中的更改。
$max
没有 $min
$min
和$max
操作符表示系统应避免正常的查询计划。 相反,它们会构造一次索引扫描,其中索引边界由$min
和$max
中给出的值显式指定。
警告
如果未指定两个边界之一,则查询计划将是一侧无界的索引扫描。相较于不包含任何操作符的查询,或使用两个操作符更严格地约束索引扫描的查询,这可能会降低性能。
示例
以下示例使用mongosh
包装器。
指定独占上边界
请考虑对名为collection
且具有索引{ age: 1 }
的集合执行以下操作:
db.collection.find( { <query> } ).max( { age: 100 } ).hint( { age: 1 } )
此操作将查询限制为字段age
小于100
的文档,并强制执行扫描从MinKey到100的{ age: 1 }
索引的查询计划。
与 $min
单独使用$max
或与$min
结合使用可将同一索引的结果限制在特定范围内,如下例所示:
注意
从 MongoDB 4.0开始, $max
指定的边界必须大于$min
指定的边界。
db.collection.find().min( { age: 20 } ).max( { age: 25 } ).hint( { age: 1 } )