为什么mongodb $ all运算符使用所有子数组进行查询?

时间:2013-01-11 09:32:45

标签: mongodb

我有一些结构如下的测试文档:

{
        "foo" : {
                "bar" : [
                        {
                                "a" : [
                                        "1",
                                        "4"
                                ]
                        },
                        {
                                "a" : [
                                        "1",
                                        "7"
                                ]
                        }
                ]
        }
}

现在我尝试获取所有这些文档,其中至少有一个“a”数组包含字符串“1”,“4”和“7”。 (注意:我知道不应该找到这个示例文档!)

现在我像这样查询数据库:

db.test.find({"foo.bar.a": {$all: ["1","4","7"]}})

在我看来它应该告诉我没有找到文件,但它找到了示例文档,因为“1”和“4”包含在第一个“a”数组中,“7”包含在第二个“一个“阵列。

这是$ all运算符的错误,还是我的查询错了?

2 个答案:

答案 0 :(得分:0)

您可以将MongoDB 2.2+中的Aggregation Framework用于$unwind foo.bar.a数组到符合预期的文档流中。

示例查询:

db.test.aggregate(
    // Could add a $match here to limit the number of relevant documents

    // Create a stream of documents from the foo.bar array
    { $unwind: '$foo.bar' },

    // Find arrays that have the desired elements
    { $match: {
        'foo.bar.a': { $all: ["1","4","7"] }
    }},

    // Re-group by original document _id with matching array elements
    { $group: {
        _id: "$_id",
        'a': { $push: '$foo.bar.a' }
    }}
)

示例结果:

{
    "result" : [
        {
            "_id" : ObjectId("50f08b392aa92c6de18aa70a"),
            "a" : [
                [
                    "7",
                    "4",
                    "1"
                ]
            ]
        },
        {
            "_id" : ObjectId("50f08b322aa92c6de18aa709"),
            "a" : [
                [
                    "1",
                    "4",
                    "7"
                ]
            ]
        }
    ],
    "ok" : 1
}

答案 1 :(得分:0)

这是你需要的吗?一个元素,其“a”数组包含所有指定的值。

db.test.find({“foo.bar”:{$ elemMatch:{“a”:{$ all:[“1”,“4”,“7”]}}}}}