Mongodb 什么';$min/$max和$lte/$gt之间的区别是什么?
我不太明白Mongodb 什么';$min/$max和$lte/$gt之间的区别是什么?,mongodb,Mongodb,我不太明白$min/$max和$lte/$gt之间的区别是什么?我不确定这些方法的查询修饰符和查询运算符有何不同。我知道复合索引边界需要$min/$max,但在单个索引字段上指定边界会有区别吗?简单解释:如果没有该字段上的索引,min-max不起作用 详细解释: 和是查询修饰符,和是查询运算符。查询修饰符(顾名思义)修改查询的行为。但是 在服务器上,MongoDB将查询和选项视为单个选项 反对 这意味着如果您正在执行db.coll.find({}).min({a:1})它不会找到所有内容,然后选
$min
/$max
和$lte
/$gt
之间的区别是什么?我不确定这些方法的查询修饰符和查询运算符有何不同。我知道复合索引边界需要$min
/$max
,但在单个索引字段上指定边界会有区别吗?简单解释:如果没有该字段上的索引,min-max不起作用
详细解释:
和是查询修饰符,和是查询运算符。查询修饰符(顾名思义)修改查询的行为。但是
在服务器上,MongoDB将查询和选项视为单个选项
反对
这意味着如果您正在执行db.coll.find({}).min({a:1})代码>它不会找到所有内容,然后选择所有更大或等于一的内容。大家最熟悉的是sort
modifier。您也可以以这种方式使用每个修饰符db.collection.find()。\u addSpecial(“修饰符名称”、“选项”)
两个命令都在做类似的事情。差别是微妙的:
$min和$max只能在该字段具有索引的情况下进行搜索。否则它将错误地失败。此外,在搜索它时,使用的是该索引,如果您想使用其他内容,则必须使用命令说明这一点
假设您有具有以下格式文档的集合拉链:
{
"city" : "ACMAR",
"loc" : [-86.51557, 33.584132],
"pop" : 6055,
"state" : "AL",
"_id" : 35004
}
如果您要执行db.zips.find().min({pop:5000})
。它只会被错误压碎。在使用$gte执行相同操作时,将很好地执行。如果您要确保在此字段上建立索引,则可以执行此命令,它将使用此索引
关于提示命令的注释。假设您需要类似以下内容db.zips.find({u id:333}).min({pop:5000})
,并且您有pop上的索引。您将使用它,但是使用id索引会更好
因此,总的来说,由您决定什么更好。
- 如果您在字段上有一个索引,并且总是想使用它,那么可以使用.max/.min
- 如果你没有它-你必须坚持使用$gte/$lt
- 如果您有一个索引,但认为mongo更清楚它应该使用什么索引,那么也可以使用$gte/$lt
PS.我不喜欢这个命令,因为它们模棱两可。一分钟的边界是包含的,最大的边界是独占的,我不知道如何记住它。$min和$max决定了索引中扫描的最小值和最大值,其中gt和lte只是范围查询,所以,$min
/$max
更好?如果不是最终结果,我不确定这是否会影响性能。这取决于您在做什么?我想在_id字段上翻页一个集合,并在投票数上翻页另一个集合。$min
和$max
还强制使用索引(对于指定的字段),即使另一个索引可能更有意义。最小值和最大值确实会影响查找标准与$gt和ltcan不同的地方。请重新表述您的评论,因为我无法理解:-)最小值和最大值能够定义索引的下限,或者更确切地说,如果$min
/$max
将光标绑定在索引级别,则范围运算符不使用下限,您可能希望何时使用$lte
/$gt
?我仍然不明白为什么这些运算符同时存在,尽管我知道它们在索引方面的具体区别。@PaulKonova一个很好的理由是改变查找的实际工作方式,有许多分页情况下,$gt和lt不起作用,因此限制索引的实际扫描,还有其他情况