Mongo查询问题$ gt,$ lt

时间:2011-02-11 06:24:45

标签: mongodb

我在下面有一个查询。我希望获得介于4和6之间的项目,因此只有a:1应匹配,因为它在b中的值为5。

> db.test.find({ b : { $gt :  4  }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

有人能说出为什么a:2匹配此查询吗?我真的不明白为什么要归还。

我也尝试了教程中指定的内容,但id似乎不起作用:

> db.test.find({ b : { $gt :  4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

这是为了避免任何关于GT / GTE的混淆

> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

只有a:1应该返回。

正如所建议的那样,我试试了$ elemMatch,但它似乎也没有用(objectIds不同,因为我在不同的机器上)

> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>

没有退回任何文件。

4 个答案:

答案 0 :(得分:63)

这是一个非常混乱的话题。我在10gen工作,我不得不花一些时间把头包住;)

让我们来看看查询引擎如何处理此查询。

以下是查询:

> db.test.find({ b : { $gt :  4, $lt : 6}});

当它到达记录似乎不应该匹配时......

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

不对数组的每个元素执行匹配,而是对整个数组执行匹配。

比较分三个步骤进行:

第1步:查找b值大于4的所有文档

b:[2,4,6,8]匹配,因为6& 8大于4

第2步:查找b值小于6的所有文档

b:[2,4,6,8]匹配因为2& 4小于6

第3步:找到在步骤1和步骤1中匹配的文档集。 2.

b:[2,4,6,8]的文件与步骤1& 2所以它作为匹配返回。请注意,此步骤中的结果也是重复数据删除,因此同一文档不会返回两次。

如果希望查询应用于数组的各个元素,而不是整个数组,则可以使用$ elemMatch运算符。例如

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }

答案 1 :(得分:4)

$ gt

Syntax: {field: {$gt: value} }

例如:

db.inventory.find( { qty: { $gt: 20 } } )

$ LT

Syntax: {field: {$lt: value} }

例如:

db.inventory.find( { qty: { $lt: 20 } } )

EG2:

db.inventory.find({ qty : { $gt :  20, $lt : 60}});

答案 2 :(得分:0)

.find( {$and:[ {b:{$gt:4}}, {b:{$lt:6}} ]} )

答案 3 :(得分:-9)

因为您没有查看文档。

http://www.mongodb.org/display/DOCS/Advanced+Queries

并检查页面上的“范围”。

您的查询语法也不正确(与示例比较)

问题的“为什么a:2”部分也没有任何意义,因为“a”不涉及您的查询。如果您要搜索:1,则必须将其包含在查询中。

请记住,除非您使用$或运算符,否则默认情况下所有查询子句都是AND组合。