我必须收集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)
})
答案 0 :(得分:2)
在node.js中异步执行操作的最佳方法是使用ASYNC或PROMISE等模块。
您可以访问async并访问此库提供的所有模块。
异步库提供的主要模块是
您还可以使用PROMISES,因为它们是ECMA SCRIPT 6的一部分,您可以使用各种模块来完成此任务。