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

pau*_*kon 3 mongodb

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

Sal*_*ali 5

简单说明: 如果没有该字段的索引,则min max不起作用.

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

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

这意味着,如果你这样做,db.coll.find({}).min({a : 1});它找不到所有东西,然后选择更大或更大的一切.每个人最熟悉的是sort修饰符.您也可以这种方式使用每个修饰符db.collection.find()._addSpecial("modifierName", "options" )

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

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

{
  "city" : "ACMAR",
  "loc" : [-86.51557, 33.584132],
  "pop" : 6055,
  "state" : "AL",
  "_id" : 35004
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意的话db.zips.find().min( { pop: 5000 } ).它会因为错误而粉碎.虽然使用$ gte做同样的事情会被执行得很好.如果要确保此字段的索引,则可以执行此命令,它将使用此索引.

关于提示命令的评论.假设您需要这样的东西,db.zips.find({_id : 333}).min( { pop: 5000 } )并且您有弹出索引.你会使用它,但是使用_id索引要好得多.

总而言之,由您来决定什么是更好的.

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

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