2017-02-12 145 views
0

我必須要mongodb集合。 首先我會打電話給coll1並獲得ids.Then我想調用coll2並通過id和其他字段進行搜索。如何在節點js中調用同步mongo查詢

當我打電話給funtion時,它正在回調undefined。

我如何等待直到我不能從功能中獲得結果。

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做,但一旦它解決的話,我可以查詢以收集2還..

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並訪問此庫提供的所有模塊。通過異步庫提供

主要模塊有

  1. async.series =>這是你可以在你的情況下使用什麼。 2.async.parallel
  2. async.auto =>我會建議你使用這個,因爲它爲您提供執行操作異步以及同步

進一步還可以像現在他們使用PROMISES ECMA SCRIPT 6的部分還有各種模塊,您可以使用它來完成此操作。

+0

感謝您的快速回復。我是新的節點js.我得到了你想說的..但我怎麼會在我的代碼中使用汽車..你可以幫我在code.how我的代碼將使用自動? –

+0

你的代碼中還有幾個問題。你必須在javascript中學習閉包,你將學習如何在javascript中實現循環。那麼當你的循環像{j == workDocs [i] .item_state.length-1}那樣結束時,你的回調應該是最後的。只需要在你的第一個查詢中運行兩個函數,然後在第二個函數中你可以使用1st的結果並執行進一步的步驟。 –

+0

是的,我必須把集合1查詢以外的回調..我可以在自動創建2函數,首先將查詢coll1其輸出將轉到function2,這將查詢collection2。但是,我們如何將汽車本身稱爲funtion ..請參閱我的示例。 –