MongoDB嵌套数组查询

MongoDB嵌套数组查询,mongodb,mongodb-query,nosql,Mongodb,Mongodb Query,Nosql,我问这个问题是对这个问题的评论,并在mongodb上发布了一个用户。到目前为止没有人回应,所以我只能问一个单独的问题 各国: 如果该字段包含数组,则$in运算符将选择 其字段包含至少包含一个数组的文档 与指定数组中的值匹配的元素(例如, (等) 我正在使用: mongod --version: db version v2.2.2, pdfile version 4.5 Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5a

我问这个问题是对这个问题的评论,并在mongodb上发布了一个用户。到目前为止没有人回应,所以我只能问一个单独的问题

各国:

如果该字段包含数组,则$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
为什么我需要全部美元

> 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表示单个值字段,$all表示数组

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

现在,
db.nested.findOne({'level1.level2.0':{'in':['item00']}}})
也因为类似的原因无法工作$in用于将具有单个值(您有一个数组)的字段与数组中的多个值(在查询中指定)进行比较。 $in的意思是:给我包含此字段的文档,该字段的值包含在此数组中

$all起作用是因为它的意思是:给我这个字段有几个值的文档,这个数组(在查询中)的所有值都包含在这个字段中。(编辑)

可能很难获得,但请查看文档中对每个方面的说明:

$all选择字段保存数组并包含数组中所有元素的文档

$in选择字段值等于指定数组中任何值的文档(
例如,等)


希望它有帮助

在运行了一些查询之后,我得出结论,$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提交请求。

使用嵌套
elemMatch
搜索阵列中的嵌套级别


详细信息

感谢您抽出时间回复,但不幸的是,您的答案都不正确。在手册的“阅读”页面中,搜索“以下操作将光标返回到bios集合中阵列字段contribs包含元素“UNIX”的所有文档:”。在我问题顶部附近的文档链接中,您可以看到$In应适用于包含阵列的字段。最后,您的语句“$all is working because…”是错误的:并非字段中的所有值都需要存在于查询中,但查询中的所有值都必须存在于文档的字段中。感谢“$all is working because…”中的更正。所以您是说$in应该适用于数组,文档中也这么说。现在我很好奇。我要做些实验,看看能不能找到答案。你这里有一个非常有趣的问题!我把我的发现放在另一个答案里,希望对你有用。呵呵。现在你说话了。我在一些查询中使用了这种变通方法,但是:如果我想使用$nin怎么办?同样的神秘行为出现了,然后我们开始怀疑我们得到的所有查询结果。另外,感谢“数组数组”这个词。