mongodb - Mongo 查询问题 $gt,$lt

标签 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 }}});
>

没有文件被退回。

最佳答案

这是一个非常令人困惑的话题。我在 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 步和第 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 ] }

关于mongodb - Mongo 查询问题 $gt,$lt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966203/

相关文章:

mongodb - 排除 $lookup 聚合中的字段

Facebook 个人资料图片速率限制客户端与服务器

spring - bean 实例化失败 : Specified class is an interface

node.js - Mongodb中的Bulkwrite操作是如何工作的?

spring - 哪个版本的 Spring Data MongoDB 与 Spring 3.2.2.RELEASE 兼容?

ruby-on-rails - 将这些值存储在 mongodb 中的最干净的方法?

javascript - 观察对嵌套数组的更改不会返回添加/更改的元素

node.js - 如何使用多个条件更新集合文档

javascript - 如何在函数之外访问 promise 回调值?

mysql - 将 Metabase 与 Docker SQL 或 Docker MongoDB 容器连接