Mongo查询问题$ gt,$ lt

pau*_*llb 24 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 ] }
>
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)