0

次のような構造のテスト ドキュメントがいくつかあります。

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

ここで、"a" 配列の少なくとも 1 つに文字列 "1"、"4"、および "7" が含まれているこれらすべてのドキュメントを取得しようとしています。(注: このサンプル ドキュメントが見つからないことはわかっています!)

今、私は次のようにデータベースを照会します:

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

私の意見では、ドキュメントが見つからないことを教えてくれるはずですが、最初の "a" 配列に "1" と "4" が含まれ、2 番目の "a" 配列に "7" が含まれているため、例のドキュメントが見つかります。 .

これは $all 演算子のバグですか、それともクエリが間違っているだけですか?

4

2 に答える 2

0

これはあなたが必要とするものですか?"a" 配列に指定されたすべての値が含まれる 1 つの要素。

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

于 2014-03-20T05:14:43.233 に答える
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
}
于 2013-01-11T22:18:13.663 に答える