我在下面有一个查询.我希望获得介于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 ] }
>
Run Code Online (Sandbox Code Playgroud)
有人能告诉为什么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 ] }
>
Run Code Online (Sandbox Code Playgroud)
这一点可以避免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 ] }
>
Run Code Online (Sandbox Code Playgroud)
只有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 }}});
>
Run Code Online (Sandbox Code Playgroud)
没有退回任何文件.
jar*_*red 66
这是一个非常令人困惑的话题.我在10gen工作,我不得不花一点时间把头包住;)
让我们来看看查询引擎如何处理此查询.
这是再次查询:
> db.test.find({ b : { $gt : 4, $lt : 6}});
Run Code Online (Sandbox Code Playgroud)
当它到达记录似乎不应该匹配...
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }
Run Code Online (Sandbox Code Playgroud)
不对阵列的每个元素执行匹配,而是针对整个阵列执行匹配.
比较分三步进行:
步骤1:查找b值大于4的所有文档
b:[2,4,6,8]匹配,因为6和8大于4
第2步:查找b值小于6的所有文档
b:[2,4,6,8]匹配,因为2和4小于6
第3步:找到步骤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 ] }
Run Code Online (Sandbox Code Playgroud)
小智 6
$ gt
Syntax: {field: {$gt: value} }
Run Code Online (Sandbox Code Playgroud)
例如:
db.inventory.find( { qty: { $gt: 20 } } )
Run Code Online (Sandbox Code Playgroud)
$ lt
Syntax: {field: {$lt: value} }
Run Code Online (Sandbox Code Playgroud)
例如:
db.inventory.find( { qty: { $lt: 20 } } )
Run Code Online (Sandbox Code Playgroud)
eg2:
db.inventory.find({ qty : { $gt : 20, $lt : 60}});
Run Code Online (Sandbox Code Playgroud)