2016-04-13 3 views
0

私はnodejsプラットフォーム上でのMongoDBにdb.eval()内で実行されますjavascript関数を書かれています。呼び出しdb.collection.find()はdb.eval内()

私のJS関数は次のとおりです。

(db.evalに渡される文字列「コード」に縮小され
function(data){ 
    var d = { 
     vehicle_id:data.vehicle_id, 
     timestamp:{ 
      $gte:data.start_time, 
      $lte:data.end_time 
     } 
    }; 
    var routeStatus = []; 

    db.location.find(d,function(err,result){ 
      db.result.insert({result}); 
    }); 
} 

var code = 'function(data){var d={vehicle_id:data.vehicle_id, timestamp:{$gte:data.start_time, $lte:data.end_time}}; db.location.find(d,function(err,result){return result;});}'; 

db.eval(code,[info],function(err,result){ 
    log(result); 

}); 

情報オブジェクトが呼び出さ取得に必要なすべてのフィールドが含まれています機能によって。今メイン質問はdb.location.findさ

は())ので、どのように私はdb.eval(のコールバックにその結果リターンを得ることができる非同期呼び出しです。 ?

私は単にdb.location.findのコールバック(からの結果を返すならば)それから、私は何もそのは、非同期呼び出しとして返されません取得します。

+0

私はどこに行く必要がありますされているデータを得ることはありません...しかし、場合にあなたがdb.location.findダスが完了した後に、コードを実行するコールバック内のそれぞれのものを置いたり、マングースのチェーンを使用します。 – lipp

+0

サーバ上で実行されるデータベース操作は "同期"し、コールバックを持たないため、 '.find()'の結果は単にカーソルを "インライン"に戻します。おそらく '.toArray()'が必要で、 '.eval()'の結果として何かを返すこともあります(それ自体はまだ非同期です)。つまり、あなたは本当にこれをやりたいとは思っていません。このようにサーバーサイドJavaScriptを実行すると問題が発生するため、代わりにクライアントコードから直接実行することをお勧めします。 –

+0

はい、私はあまりにもデータベースサーバー上で実行される操作が "同期"であるため、結果としてカーソルを戻そうとしましたが、nodejs-mongodbコードのように.find()がオブジェクトを返していました。さて、なぜ私はこれを行う可能性が高いのですか?@ NeilLunn膨大な量の文書を処理する操作があります。まず、いくつかのフィルタに基づいてこれらの文書をすべて取得し、次に別の集計呼び出しを実行することになっています。各ドキュメントには別のコレクションの別のドキュメントがあります。今、私たちのコード側でこれを行うには、クラスタ化はMongoのSERV – Mudassirkhan

答えて

0

は、小さいながらも便利なヒントを与えるため@NeilLunnのおかげで答えを得ました。 .toArrayは()

var docs = db.location.find().toArray(); 

をやっ

単純な私のために働いた働きました。

+0

私はより多くの提案を歓迎する! – Mudassirkhan

関連する問題