2016-05-06 11 views
0

クエリが実行された時点でキーのいずれかが不明な検索クエリを作成しようとしています。たとえば、次のドキュメントなどです。 "setup"がある場合、ドキュメントを返すことに興味があります。 true:複合mongodbドキュメントの検索

{ 
    "a": { 
     "randomstringhere": { 
      "setup": true 
     } 
    } 
} 

ただし、「randomstringhere」フィールドは、コレクション内の各ドキュメントごとに変更されるため、どのようにワイルドカード処理を行うことはできません。

誰かが助けることができますか?

答えて

0

これではあまりできません。しかし、あなたは、あなたがよりあなたはメカニズムを必要とする現在の設計と同様に、単一のクエリでこれを行うことはできません

{ 
    'a' : { $elemMatch: { setup: true } , 
} 
0

を見て、クエリを書くことができます

{ 
    "a": [ 
     { 
     "keyName": "randomstringhere", 
     "setup": true 
     }, 

     //... 
    ] 
} 

のようなあなたのコレクションのスキーマを変更することができます必要なすべてのランダムキーを取得し、可変キー名のリストを取得した場合に$or演算子を使用するクエリドキュメントをアセンブルします。

Map-Reduceを使用すると、操作の最初の部分が可能です。結果のコレクションで明確なを実行し、すべてのランダムなキーのリストを取得するには

mr = db.runCommand({ 
    "mapreduce": "collection", 
    "map" : function() { 
     for (var key in this.a) { emit(key, null); } 
    }, 
    "reduce" : function() { }, 
    "out": "collectionKeys" 
}) 

::次のMapReduce操作は_id値として、すべてのランダムキーを使用してcollectionKeysと呼ばれる別のコレクションに移入されます

db[mr.result].distinct("_id") 

例出力リレー

["randomstring_1", "randomstring_2", "randomstring_3", "randomstring_4", ...] 

さて、上記のリスト与え、あなたはクレアでクエリを組み立てることができますループ内でそのプロパティが設定されているオブジェクトを検索します。

db.collection.find(query) 

ので、サブ文書のキーの上のリストを使用して、あなたは動的にはJavaScriptの使用して、上記構築することができます。

var query = { 
    "$or": [ 
     { "a.randomstring_1.setup": true }, 
     { "a.randomstring_2.setup": true }, 
     { "a.randomstring_3.setup": true } 
    ] 
}; 

あなたは、あなたのクエリで使用することができます。通常、クエリ文書は、この構造を持っていますmap()方法:

​​
関連する問題