ここで検索する必要があるパスの「トップレベル」ではなく、「アイテム1」または「アイテム2」です"と"データ "はその中のサブ要素です。
基本的なケースは、ルート要素が少なくとも「存在する」ことが知られている"dot notation"を使用することです。また、$in
演算子はMongoDBが気にしないので、配列内の値を照合するだけでよいことにも注意してください。しかし、あなたは代わりに、ネストされた$elemMatch
が必要になります。
db.my_data.find({
"$or": [
{ "Item 1.data": {
"$elemMatch": {
"$elemMatch": { "$eq": "green" }
}
}},
{ "Item 2.data": {
"$elemMatch": {
"$elemMatch": { "$eq": "green" }
}
}}
]
})
各可能なパスを検索する$or
条件内の完全なパスを述べることが必要であるので、先行パスの一部に一致するための「ワイルドカード」はありません資料。
可能なすべての接頭辞のキーを書くことは、あなたの唯一の他のアプローチは、マッチングのための論理を決定するために$where
でJavaScriptの評価を使用している、実用的ではない場合:
db.my_data.find(function() {
var doc = this;
delete doc._id;
var matched = false;
for (k in doc) {
matched = doc[k].data.some(function(el) {
return el.some(function(inner) {
return inner === "green";
});
});
if (matched) break;
}
return matched;
})
か、そのロジックのいくつかのバリエーション実際に可能テストしますあなたの "緑の"値を格納する "データ"配列を持つ要素。 $where
は、条件を評価するために各ドキュメントで実行する必要があり、インデックスを使用して結果をフィルタリングすることはできないため、優れたソリューションではありません。これはコレクション全体をスキャンすることを意味し、基本的には最も遅いアプローチです。
また、function()
の内容は、pymongoや他の言語ドライバの場合、$where
の引数に "string"として送信されますが、基本的なコンテキストは、そのJavaScriptコードですサーバー上で評価されます。
さらに、ドキュメントを変更して、照会する要素に常に一貫したパスがあるようにします。以下のような:
{
"items": [
{ "name": "Item 1", "data": [["green", 1]] },
{ "name": "Item 2", "data": [["blue", 9], ["green", 1]] }
]
}
次に、あなただけのこの単純なクエリを発行することができます:「パス」として
db.my_data.find({ "items.data": { "$elemMatch": { "$elemMatch": { "$eq": "green" } } } })
を常に"items.data"
で、これはすべての要素
をテストするだけで、そのパスのための1つのcondtionすることができますこれは役に立ちます。 http://stackoverflow.com/questions/17303833/mongodb-nested-array-query – lostintranslation