$ min / $ max和$ lte / $ gt之间有什么区别?

时间:2013-10-31 21:00:36

标签: mongodb

我不太明白$min / $max$lte / $gt之间的区别是什么?我不确定查询修饰符与这些方法的查询运算符有何不同。我理解$min / $max对于复合索引边界是必要的,但它是否会对在单个索引字段上指定边界产生影响?

1 个答案:

答案 0 :(得分:5)

简单说明: min max在该字段没有索引时不起作用。

更长的解释: $min$max是查询修饰符,$lte$gt是查询运算符。查询修饰符(顾名思义)修改查询的行为。但是

  

在服务器上,MongoDB将查询和选项视为单个   对象

这意味着,如果您正在执行db.coll.find({}).min({a : 1});,它找不到所有内容,然后选择更大或等于1的所有内容。每个人最熟悉的是sort修饰符。您也可以通过这种方式使用每个修饰符db.collection.find()._addSpecial("modifierName", "options" )

两个命令都在做类似的事情。差异很微妙: $ min和$ max只能搜索该字段是否有索引。否则它将失败并出错。此外,在搜索时正在使用该索引,如果您想使用其他内容,则必须使用hint命令告诉它。

假设您的集合拉链包含以下格式的文档:

{
  "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 } ),并且您有弹出索引。你将使用它,但是使用_id索引会更好。

总而言之,由您决定哪些更好。

  • 如果您在该字段上有索引并且始终想要使用它 - 您可以使用.max / .min
  • 如果你没有 - 你必须坚持使用$ gte / $ lt。
  • 如果您有一个索引,但认为mongo更好地知道它应该使用什么索引,那么也可以使用$ gte / $ lt

PS。我不喜欢这些命令,因为它们含糊不清。只有一分钟,边界是包容性的,最大值是独占的,我不知道如何记住它。