48

別の質問へのコメントとしてこれを尋ね、mongodb-user にも質問を投稿しました。今のところ回答がないので、別の質問をすることに頼っています。

ドキュメントには次のように記載されています。

フィールドが配列を保持している場合、 $in 演算子は、指定された配列の値と一致する要素を少なくとも 1 つ含む配列をフィールドが保持しているドキュメントを選択します (例: 、など)。

私は使用しています:

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 シェルの場合:

db.nested.insert({'level1': {'level2': [['item00', 'item01'], ['item10', 'item11']]}})

ドキュメントに従って動作するはずのクエリと、それらが生成する結果のリストを次に示します。

なぜこれが機能しないのですか?

> db.nested.findOne({'level1.level2.0': 'item00'})
null

なぜ $all が必要なのですか?

> db.nested.findOne({'level1.level2.0': {'$all': ['item00']}})
{
    "_id" : ObjectId("51a7a4c0909dfd8872f52ed7"),
    "level1" : {
        "level2" : [
            [
                "item00",
                "item01"
            ],
            [
                "item10",
                "item11"
            ]
        ]
    }
}

次の少なくとも 1 つが機能するはずですよね?

> db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})
null

> db.nested.findOne({'level1.level2': {'$in': ['item00']}})
null

何か案は?クエリ構文が宣伝どおりに機能しない場合は、MongoDB を放棄することを検討しています。

ありがとう!

4

3 に答える 3

10

elemMatch配列内のネストされたレベルを検索するには、 nested を使用します。

詳細MongoDB で配列の配列を照会する

于 2013-06-26T23:50:22.133 に答える
6

簡単な答え: $in は単一値フィールド用で、$all は配列用です。

まず、db.nested.findOne({'level1.level2.0': 'item00'})level1.level2.0 が配列を保持していて、それを単一の値と比較しようとしているため、機能しません。

現在、db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})同様の理由でどちらも機能しません。$in は、単一の値 (配列がある) を持つフィールドを、配列内の複数の値 (クエリで指定) と比較するためのものです。$in は言っています: この配列に値が含まれるこのフィールドを持つドキュメントを教えてください。

$all が機能しているのは、このフィールドにいくつかの値があり、(クエリ内の) この配列のすべての値がそのフィールドに含まれているドキュメントを教えてください。(編集)

入手するのは難しいかもしれませんが、それぞれのドキュメントに記載されている内容を見てください。

$all は、フィールドが配列を保持し、配列内のすべての要素を含む (e.g. <value>, <value1>, etc.ドキュメントを選択します。

$in は、フィールド値が指定された配列内の任意の値と等しいドキュメントを選択します( e.g. <value1>, <value2>, etc.)

それが役に立てば幸い

于 2013-06-25T20:01:44.820 に答える