1

私は少し奇妙に感じる状況にあります...意図的に重複を含むキーのリストがあります。引数のために、このリストが のように見えると仮定しましょう[1,2,3,2,1]。現在、これらの Id に属するドキュメントをフェッチするコードは、キーのリストをループし、findOne()ドキュメントを呼び出して配列にプッシュします。

したがって、次のような構造があります。

for (var i = 0; i < keys.length; i++) {
  documents.push(db.items.findOne(keys[i]);
}

これをより...エレガントな...方法で、できれば単一のクエリで行う方法があるかどうか疑問に思っていますか? 順序を守ることはプラスになりますが、厳密には必須ではありません。

編集: これは MongoDB の質問であることに注意してください。上記のループを db.items.find() への単一の呼び出しに置き換える方法を探しています。

4

2 に答える 2

2

重複するキーのリストを取得する直接的な方法はないと思いますが、キーは一意であると言ったので、$inループを使用してそれを行うことができます。

var keys = [1,2,3,2,1];
var docHash = {}; //auxiliary hashtable containing mapping id -> document

var documents = []; //the result

db.items.find({id : {$in : keys}})
     .forEach(
         function(doc) {
             //if multiple documents can have the same key change it to:
             // if (docHash[doc.id]) { 
             //     docHash[doc.id].push(doc);
             // } else {
             //     docHash[doc.id] = [doc];
             // } 
             docHash[doc.id] = doc; 
         });

keys.forEach(function(i) {
     // if multiple documents can have the same key change it to:
     // docHash[i].forEach(function(item) {documents.push(item);});
     documents.push(docHash[i]);
}

元のファイルよりも長くなりますが、データベースへのクエリは1回だけであることに注意してください。ボーナスとして、指定されたキーと同じ順序でドキュメントを返します。

于 2012-08-17T09:09:27.687 に答える
0

少し役立つはずのJavaスクリプトでfor-each関数を使用します。

for (var i in keys) {// i will be  1 ,2 ,3 ,3 ,1
   documents.push(db.items.findOne(i);      
 }

または私はあなたの質問の意図を完全に逃したのでしょうか?しかし、再び重複キーはどの配列にも存在しません..

var used=Array();
for (var i = 0; i < keys.length; i++) {
  if (!used[keys[i]]){
       used[keys[i]]=1;
       documents.push(db.items.findOne(keys[i]);}
}

重複を無視し、それらを1つのイーサとしてカウントするか、キーでクエリを実行して、それらを重複を含まない新しい配列にレンダリングできます

于 2012-08-16T13:13:51.800 に答える