3

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

4

1 回答 1

5

简单解释: 在该字段上没有索引的情况下,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。我不喜欢这个命令,因为它们模棱两可。一分钟的边界是包容性的,最大的是排斥性的,我不知道如何记住它。

于 2013-10-31T22:34:50.847 回答