4

正規表現と埋め込みオブジェクトのクエリを組み合わせようとしていますが、惨めに失敗しています。私はmongodbの制限に達しているか、少し間違っているだけかもしれません。誰かがこれに遭遇した可能性があります。ドキュメントは確かにこのケースをカバーしていません。

照会されるデータ:

{
    "_id" : ObjectId("4f94fe633004c1ef4d892314"),
    "productname" : "lightbulb",
    "availability" : [
            {
                    "country" : "USA",
                    "storeCode" : "abc-1234"
            },
            {
                    "country" : "USA",
                    "storeCode" : "xzy-6784"
            },
            {
                    "country" : "USA",
                    "storeCode" : "abc-3454"
            },
            {
                    "country" : "CANADA",
                    "storeCode" : "abc-6845"
            }
    ]
}

コレクションには 1 つのレコードのみが含まれていると仮定します

このクエリは 1 を返します。

db.testCol.find({"availability":{"country" : "USA","storeCode":"xzy-6784"}}).count();

このクエリは 1 を返します。

db.testCol.find({"availability.storeCode":/.*/}).count();

ただし、このクエリは 0 を返します

db.testCol.find({"availability":{"country" : "USA","storeCode":/.*/}}).count();

誰かが理由を理解していますか?これはバグですか?

ありがとう

4

1 に答える 1

3

埋め込まれたストアコードを間違って参照しています。実際にはオブジェクトの配列であるのに、埋め込まれたオブジェクトとして参照しています。これらの結果を比較します。

db.testCol.find({"availability.0.storeCode":/x/});
db.testCol.find({"availability.0.storeCode":/a/});

上記のサンプル ドキュメントを使用すると、最初の storeCode には x が含まれていないため ("abc-1234")、最初のドキュメントは返されません。2 番目のドキュメントはドキュメントを返します。配列の単一の要素を見て、位置を渡す場合は問題ありません。配列内のすべてのオブジェクトを検索するには、$elemMatchが必要です。

例として、この 2 番目のサンプル ドキュメントを追加しました。

{
    "_id" : ObjectId("4f94fe633004c1ef4d892315"),
    "productname" : "hammer",
    "availability" : [
            {
                    "country" : "USA",
                    "storeCode" : "abc-1234"
            },

    ]
}

次に、これらのクエリの結果を見てください。

PRIMARY> db.testCol.find({"availability" : {$elemMatch : {"storeCode":/a/}}}).count();
2
PRIMARY> db.testCol.find({"availability" : {$elemMatch : {"storeCode":/x/}}}).count();
1
于 2012-05-25T14:16:42.350 に答える