2017-02-12 147 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 ..请参阅我的示例。 –