如何在节点js

时间:2017-02-12 16:00:16

标签: mongodb nodes

我必须收集mongodb。 首先,我将调用coll1并获取ID。然后我想调用coll2并按ID和其他字段进行搜索。

当我打电话给它时,它正在回复未定义。

我怎么能等到直到我得不到功能的结果。

coll1 docs示例: {

" _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)         
    })

1 个答案:

答案 0 :(得分:2)

在node.js中异步执行操作的最佳方法是使用ASYNC或PROMISE等模块。

您可以访问async并访问此库提供的所有模块。

异步库提供的主要模块是

  1. async.series =&GT;这是你可以在你的情况下使用的。 2.async.parallel
  2. async.auto =&gt;我建议你使用它,因为它可以让你以异步和同步的方式执行操作
  3. 您还可以使用PROMISES,因为它们是ECMA SCRIPT 6的一部分,您可以使用各种模块来完成此任务。