Mongo的查找操作不像预期的那样工作

以下是运行良好的代码:

for(i=0;i<distinct_branch.length;i++){ myobj = {} myobj['branch'] = distinct_branch[i] myobj['total_re'] = 0 myobj['present'] = 0 myobj['absent'] = 0 myobj['weekly_off'] = 0 myobj['leave'] = 0 myobj['total_marked'] = 0 myobj['pending_attend'] = 0 myobj['dat_compliance'] = 0 myobj['pending_dat_compliance'] = 0 for(j=0;j<results.length;j++){ if(results[j].counter){ if(results[j].counter.state){ if(distinct_branch[i]==results[j].counter.state){ myobj['total_re'] = myobj['total_re'] + 1 if(results[j].attendance == 'P') { myobj['present'] = myobj['present'] + 1 myobj['total_marked'] = myobj['total_marked'] + 1 } else{ if(results[j].attendance == 'A') { myobj['absent'] = myobj['absent'] + 1 myobj['total_marked'] = myobj['total_marked'] + 1 } else{ if(results[j].attendance == 'O') { myobj['weekly_off'] = myobj['weekly_off'] + 1 myobj['total_marked'] = myobj['total_marked'] + 1 } else{ if(results[j].attendance == 'L') { myobj['leave'] = myobj['leave'] + 1 myobj['total_marked'] = myobj['total_marked'] + 1 } else{ if(results[j].attendance == 'Pending') { myobj['pending_attend'] = myobj['pending_attend'] + 1 } } } } } myobj['dat_compliance'] = ( myobj['total_marked'] / myobj['total_re'])*100 myobj['pending_dat_compliance'] = 100 - myobj['dat_compliance'] } } } } returndata.push(myobj) } 

现在我想要“返回数据应该有一个查找查询结果的属性”下面是查询:

 imports.db.mdb.collection('sales_details').find({'user.empcode':'481625'},function(err,sale_data){ myobj['test']=sale_data; }); returndata.push(myobj); 

//但是我已经尝试了每一件事,而且我无法执行这个操作.Node执行先推动操作,然后执行查询(查找)。 我甚至在search的callback中推送myobj,比较我是否等于distinct_branch.length,但是也不起作用。 提前致谢 :)

查找方法完全按照预期工作。 😉

nodejs(谷歌V8虚拟机)被devise为反应。 这是因为nodejs进程中只有一个线程运行。 因此,长时间运行的IO操作在其自己的进程中执行并行于触发IO访问的程序。

这意味着如果你执行一个db.collection.find({}, callback); vm请求mongodb进程search数据,然后将控制返回给执行下一个语句的调用程序/函数,然后再执行下一个语句,依此类推。 由于DBsearch的持续时间比赋值给variables的时间长很多,所以添加的值是未定义的。

只要DB返回search结果,它就会执行特化的callback ,并将一个错误variables和一个结果variables传递给它。 您可以使用callback来将查找方法与调用者同步。 即在确认数据可用时,在callback内执行send方法。

一个例子:让我假设你使用find方法来回答(比方说)expression路由请求。

 ... router.get(url, function(req,res,next) { db.find({...}, function(err, sale_data) { if ( err ) { next(err); } myobj['test']=sale_data; returndata.push(myobj); resp.json(returndata); }); }); 

然后在数据可用时立即发送请求。

同步对于您的示例来说很容易,但只要您使用返回的数据来启动对数据库的新asynchronous请求并使用返回数据来启动…那么最好实践一下同步框架,如async或承诺由Kris Kowalskis Q处理。