0

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

{
        "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”包含在第二个“a”数组中.

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

4

2 回答 2

0

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

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

于 2014-03-20T05:14:43.233 回答
0

您可以使用MongoDB 2.2+ 中的聚合框架$unwindfoo.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
}
于 2013-01-11T22:18:13.663 回答