2017-02-12 6 views
0

私はmongodbコレクションにする必要があります。 最初に私はcoll1を呼び出してidsを取得します。次に、coll2を呼び出し、IDとその他のフィールドで検索したいと思います。ノードjsでどのように同期同期モンゴークエリを呼び出す

私がfuntionに電話しているとき、それは未定義です。

どのように私はfuntionから結果を得るまで待つことができます。

coll1ドキュメントサンプル: {

"_id":のObjectId( "")、 "container_id": "56867887fdb391ff09d15e9"、 "item_state":[ { "USER_ID":1、 "ユーザ名」: "X"、 "状態": "1" }、 { "USER_ID":2、 "ユーザ名": "Y"、 "状態": "3" } ]、 "名前": "メンバーテスト" } は、私は非同期自動概念を理解するが、それでも、それはここで空のリスト を返して、ここで

function listMyWorkitems(user_id,callback) { 
    var user_id=1; 
    var workItemList = new Array(); 
    db.collection('containers').find({'start_date':{"$lt":new Date(2017,02,11)}}).toArray(function(err,docs){ 
    console.log("doc length"); 
    console.log(docs.length); 
    for (var i = 0; i < docs.length; i++) { 
      db.collection('work_items').find({"$and":[{'container_id':docs[i]._id.toString()},{'item_state':{"$elemMatch":{'user_id':user_id,'is_active':1,'state':{"$in":["1","2","3"]}}}}]}).toArray(function(err,workDocs){ 
      //console.log(workDocs); 
      for (var i = 0; i < workDocs.length; i++) { 
        for (var j = 0; j < workDocs[i].item_state.length; j++) { 
         var doc=workDocs[i].item_state[j] 
         workItemList.push(workDocs[i].name) 
        } 
       } 
      }); 
     } 
      callback(workItemList); 
}); 
} 

listMyWorkitems(user_id,funtion(err,workItemList) { 
console.log(workItemList) 
}); 

を、コードを入力するコードは、私が今まで試したどのような..私はコレクションの1のために行われますが、それは解決されたら、私は照会することができています

var async = require('async'); 
var mongojs = require("mongojs"); 
var db = mongojs("localhost/mc_dev"); 
    async.auto({ 
      coll1task: function(callback) { 
      var idlist =[]; 
      console.log("ids fetch from collection 1"); 
      db.collection('containers').find({'start_date':{"$lt":new Date(2017,02,11)}}).toArray(function(err,docs){ 
      docs.forEach(function(doc){ 
      console.log(doc._id); 
      idlist.push(doc._id); 
      });}); 
      callback(null,idlist); 
      }, 

     finalcontrol: [ 
      'coll1task', 
      function(results,callback) { 
      console.log(results.coll1task); 
      } 
     ], 
}, 
    function(error, results) { 
     console.log('error = ', error) 
     console.log('results = ', results)   
    }) 

答えて

2

node.jsで非同期に処理する最善の方法は、ASYNCまたはPROMISEのようなモジュールを使用することです。

asyncにアクセスして、このライブラリが提供するすべてのモジュールにアクセスできます。非同期ライブラリが提供する

メインモジュールは

  1. async.seriesある=>これはあなたがあなたのケースで使用することができるものです。 2.async.parallel
  2. async.auto =>私は同期

それは非同期と同様に操作を実行するためにあなたを提供してこれを使用することができ勧めしますまた、より多くの今、彼らがそうであるようにあなたも約束を使用することができますECMA SCRIPT 6の部分には、これを行うために使用できるさまざまなモジュールもあります。

+0

お返事ありがとうございます。私はノードjsに新しいです。私はあなたが言うことを得た..しかし、私はどのように私のコードで自動を使用します..あなたは私のコードは自動を使用した後になるcode.howで私を助けてくれますか? –

+0

コードにはもう少し問題があります。あなたはjavascriptでクローズドを実装する方法を学ぶjavascriptでクローザーを勉強する必要があります。あなたのループが{j == workDocs [i] .item_state.length-1}のようになったときにコールバックが最後になるはずです。 1つ目のクエリを実行してから2番目の結果を使用して1番目のクエリを実行し、それ以降の手順を実行する、2つの関数を1つの自動関数で実行します。 –

+0

はい私はコレクション1のクエリの外にコールバックを置く必要があります。私は自動で2つの関数を作成することができますが、その出力はfunction2に行くコレクション2に行くcoll1をクエリします。しかし、私たちはどのようにオートそのものをfuntionと呼ぶことができますか?この私の例を見てください。 –

関連する問題