我不太明白$min
/$max
和$lte
/之间的区别是什么$gt
?我不确定查询修饰符与这些方法的查询运算符有何不同。我知道$min
/$max
是复合索引边界所必需的,但它对在单个索引字段上指定边界有影响吗?
1 回答
简单解释: 在该字段上没有索引的情况下,min max 不起作用。
更长的解释: $min和$max是查询修饰符,$lte和$gt是查询运算符。查询修饰符(顾名思义)修改查询的行为。但
在服务器上,MongoDB 将查询和选项视为单个对象。
这意味着,如果您这样做db.coll.find({}).min({a : 1});
,则不会找到所有内容,然后选择更大或等于 1 的所有内容。大家最熟悉的就是sort
修饰符。您也可以以这种方式使用每个修饰符db.collection.find()._addSpecial("modifierName", "options" )
这两个命令都在做类似的事情。区别很微妙:$min 和 $max 只能在该字段有索引时进行搜索。否则它将失败并出现错误。此外,在搜索它时使用的是该索引,如果你想使用其他东西,你必须用提示命令告诉它。
假设您有包含以下格式文档的集合 zip:
{
"city" : "ACMAR",
"loc" : [-86.51557, 33.584132],
"pop" : 6055,
"state" : "AL",
"_id" : 35004
}
如果你愿意db.zips.find().min( { pop: 5000 } )
。它只会因错误而崩溃。虽然对 $gte 做同样的事情会很好地执行。如果你要确保这个字段的索引,你可以执行这个命令,它将使用这个索引。
关于提示命令的评论。假设你需要这样的东西,db.zips.find({_id : 333}).min( { pop: 5000 } )
并且你在 pop 上有索引。您将使用它,但使用 _id 索引会更好。
因此,总的来说,由您决定什么更好。
- 如果您在该字段上有一个索引并且总是想使用它 - 您可以使用 .max / .min
- 如果你没有它 - 你必须坚持使用 $gte / $lt。
- 如果你有一个索引,但认为 mongo 更好地知道它应该使用什么索引,也可以使用 $gte /$lt
PS。我不喜欢这个命令,因为它们模棱两可。一分钟的边界是包容性的,最大的是排斥性的,我不知道如何记住它。