首页 文章

MongoDB嵌套数组查询

提问于
浏览
37

我已将此问题作为对another问题的评论,并在mongodb-user上发布了question . 到目前为止没有回复,所以我要求另外提问 .

documentation说:

如果该字段包含数组,则$ in运算符选择其字段包含数组的文档,该数组包含至少一个与指定数组中的值匹配的元素(例如,等)

我正在使用:

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 shell中:

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 .

谢谢!

3 回答

  • 4

    在运行一些查询之后,我得出了 $in doesn't work for an array of arrays 的结论 .

    您可以使用 $elemMatch 而它'll work, but it is frustrating that 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提交申请 .

  • 38

    使用嵌套 elemMatch 搜索数组中的嵌套级别 .

    详情Querying an array of arrays in MongoDB

  • 7

    简短回答:$ in表示单值字段,$ all表示数组 .

    首先, db.nested.findOne({'level1.level2.0': 'item00'}) 不起作用,因为level1.level2.0包含一个数组,并且您尝试将其与单个值进行比较 .

    现在,由于类似的原因, db.nested.findOne({'level1.level2.0': {'$in': ['item00']}}) 无效 . $ in用于将字段与单个值(您有一个数组)与数组中的多个值(在查询中指定)进行比较 . $ in说:给我这个字段的文档,该值包含在这个数组中 .

    $ all正在工作,因为它说:给我这个字段有多个值的文档,这个数组的所有值(在查询中)都包含在该字段中 . (编辑)的

    可能很难得到,但看看文档说的每个:

    $ all选择字段包含数组的文档,并包含数组中的所有元素(例如<value>,<value1>等) . $ in选择字段值等于指定数组中任何值的文档(例如<value1>,<value2>等)

    希望能帮助到你

相关问题