MongoDB 嵌套数组查询

标签 mongodb mongodb-query nosql

我已将此作为对 another 的评论提出来的。问题,并发布了question在 mongodb 用户上。到目前为止没有任何回应,所以我求助于另一个问题。

documentation状态:

If the field holds an array, then the $in operator selects the documents whose field holds an array that contains at least one element that matches a value in the specified array (e.g. , , etc.)

我正在使用:

mongod --version:
db version v2.2.2, pdfile version 4.5
Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5af9d664267

mongo --version:
MongoDB shell version: 2.0.4

在 MongoDB 外壳中:

db.nested.insert({'level1': {'level2': [['item00', 'item01'], ['item10', 'item11']]}})

这里是根据文档应该工作的查询列表,以及它们产生的结果:

为什么这不起作用?

> db.nested.findOne({'level1.level2.0': 'item00'})
null

为什么我需要 $all?

> db.nested.findOne({'level1.level2.0': {'$all': ['item00']}})
{
    "_id" : ObjectId("51a7a4c0909dfd8872f52ed7"),
    "level1" : {
        "level2" : [
            [
                "item00",
                "item01"
            ],
            [
                "item10",
                "item11"
            ]
        ]
    }
}

以下至少一项应该有效,对吧?

> db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})
null

> db.nested.findOne({'level1.level2': {'$in': ['item00']}})
null

有什么想法吗?如果查询语法不像宣传的那样工作,我们正在考虑放弃 MongoDB。

谢谢!

最佳答案

在运行了一些查询之后,我得出的结论是 $in 不适用于数组数组

您可以改用 $elemMatch 并且它会起作用,但令人沮丧的是 MongoDB 的文档没有警告它。

我创建了这个文档:

{
      "_id": "51cb12857124a215940cf2d4",
      "level1": [
        [
          "item00",
          "item01"
        ],
        [
          "item10",
          "item11"
        ]
      ],
      "items": [
        "item20",
        "item21"
      ]
}

请注意,“items”字段是一个字符串数组,此查询完美运行:

db.nested.findOne({"items":{"$in":["item20"]} })

现在,“level1.0”也是一个字符串数组,唯一的区别是它在另一个数组中。此查询应该有效,但无效:

db.nested.findOne({"level1.0":{"$in":["item00"]} })

获得结果的唯一方法是使用 $elemMatch:

db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })

所以 $elemMatch 解决了这个问题,但真正的解决方案是更新 MongoDB 的文档以声明 $in 不适用于数组数组。也许你应该向 10gen 提交请求。

关于MongoDB 嵌套数组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303833/

相关文章:

node.js - Mongoose 中的静态变量可能吗?

node.js - 如何对存储桶聚合阶段的输出进行排序?

mongodb - 如何在 MongoDB 的项目数组中查找包含非空数组的文档

java - Oracle NoSQL 的主要和次要路径/组件

python - Mongodb DeprecationWarning : count is deprecated. 使用 Collection.count_documents 代替

database - Cassandra - 对于给定的 ColumnFamily,每个节点恰好一行宽?

javascript - 使用 Python 和 MongoDB 进行实时分析

javascript - 使用 $regex 查询 Mongoose 不返回任何结果

mongodb - 如何在mongodb中对map reduce结果执行mapreduce

java - Spring 可分页排序与 mongoOperations 一起工作不正确。排序顺序不正确