我在下面有一个查询。我希望获得介于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 }}});
>
没有退回任何文件。
答案 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组合。