2016-08-16 4 views
0

mongoシェルで動的クエリを記述する際に助けが必要です。 フィールド値が指定されている場合にのみドキュメントを取得する

function(a, obj){ 
    db.courseContent.aggregate({$match: {Actor: a, ObjectId: obj}}) 
} 

上記の関数では、私は時々 aまたは objのいずれかを渡しません。 それぞれの値のドキュメントを返す関数が必要です。

If both a & obj are passed it should return documents matching both a & obj but not with matching either 'a' or 'obj'

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

+0

あなたはパラメータのために、あなたのコード内で確認することができます。両方が存在する場合は、$と条件、またはMongodbクエリの$または条件を使用してください – Webdev

+0

サンプルとして2つのフィールドのみを記述しました。実際には8つのフィールドがあり、2つまたは3つの組み合わせ、または1つだけの組み合わせが得られます。あなたの場合、私はパラメータを識別するために多くのループを記述する必要があります。つまり、それは検索基準です。 –

答えて

0

$and operatorあなたは上のすべての提出された値と一致するように、ここで必要なものです。おそらく、このような

{$match: {$and: [Actor: a, ObjectId: obj]}} 

あなたが動的にすぎが気にすることなく、そのように一緒にクエリを置くことができ、:あなたはこのようになりますしたいクエリ

function(a, b, c, d, e, f, g, h){ 
    var match = []; 
    if (a) { match.push({Alpha: a}); } 
    if (b) { match.push({Bravo: b}); } 
    if (c) { match.push({Charlie: c}); } 
    if (d) { match.push({Delta: d}); } 
    if (g) { match.push({Echo: e}); } 
    if (e) { match.push({Foxtrot: f}); } 
    if (f) { match.push({Gamma: g}); } 
    if (h) { match.push({Hotel: h}); } 
    db.courseContent.aggregate([{$match: {$and: match}}]) 
} 
+0

素晴らしい質問、ありがとう、ヴィンス。 最後の集計ステートメントでもう1つの '}'が見つかりませんでした。 –

+0

ありがとうございました@NNandu、私は不足している '}'を修正しました。 –

0

はこれを試してみてください。

function(a, obj){ 
     if(a!='' && a!=undefined && obj!='' && obj!=undefined){ 

     db.courseContent.aggregate({$match:{$and:[{Actor: a, ObjectId: obj}]}}); 
     } 
     else if(a!='' && a!=undefined){ 
     var obj={}; 
     var $match={}; 
     var finalobj={}; 
     finalobj["Actor"]=a; 
     obj["$match"]=finalobj; 
     db.courseContent.aggregate(obj); 
     } 
     else if(obj!='' && obj!=undefined){ 
     var obj={}; 
     var $match={}; 
     var finalobj={}; 
     finalobj["ObjectId"]=obj; 
     obj["$match"]=finalobj; 
     db.courseContent.aggregate(obj); 
     } 
    } 
+0

これは動作していますが、元のコードでは、8つのフィールドがあります。つまり、else条件の場合は36を書き込む必要があります。これを処理する他の方法はありますか? –

+0

列に未定義の値を指定した場合、Mongodbは応答しません。したがって、値が存在するときにすべてのフィールドを含める必要があります。つまり、$と演算子を使用する必要があります。したがって、ケース。 –

+0

大丈夫、スクリプトのおかげで。スクリプトで問題が見つかりました。obj変数の値を渡してもエラーになります。
エラー:jsオブジェクトをBSONに変換すると、深さ制限が150を超えました。サイクルはありますか? : [email protected]/mongo/shell/db.js:114:13 [email protected]/mongo/shell/db.js:124:16 [email protected]/ mongo/shell/db.js:109:13 [email protected]/mongo/shell/collection.js:127:12 DBCollection.prototype.aggregate/doAgg <@ src/mongo/shell/collection.js –

0

あなたのために働くかもしれない汎用コード

function(valuearray,keyarray){ 
    var and={}; 
    and.$and=[]; 
    var obj={}; 
    for(var i=0;i<valuearray.length;i++){ 
    if(valuearray[i]!=undefined && valuearray[i]!=''){ 
     obj[keyarray[i]]=valuearray[i]; 
     and.$and.push(obj); 
     } 
    } 
    db.courseContent.aggregate({$match:and}); 
    } 
+0

こんにちは、ありがとうございました。これは、文字列を作成してコレクションをチェックするより一般的ですが、keyArrayと同じくらい大きくなくてもキー配列を切り捨てて、すべてのドキュメントをフェッチしないようにしています。対照的に、以前の答えははるかに近かったが、エラーを投げた。以前の答えを微調整することは可能ですか? –

関連する問題