我不太明白$min
/ $max
和$lte
/ $gt
之间的区别是什么?我不确定查询修饰符与这些方法的查询运算符有何不同。我理解$min
/ $max
对于复合索引边界是必要的,但它是否会对在单个索引字段上指定边界产生影响?
答案 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索引会更好。
总而言之,由您决定哪些更好。
PS。我不喜欢这些命令,因为它们含糊不清。只有一分钟,边界是包容性的,最大值是独占的,我不知道如何记住它。