Mongo的查找操作没有按预期工作

时间:2016-12-22 12:56:05

标签: javascript node.js mongodb

以下代码运作良好:

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);

//但是我已经尝试过各种各样的东西而且我无法执行此操作。节点执行先推送操作然后执行查询(查找)。 我甚至通过比较,如果我等于distinct_branch.length而将myobj推送到find的回调中,但这也无法正常工作。 在此先感谢:)

1 个答案:

答案 0 :(得分:2)

find方法完全按预期工作。 ; - )

nodejs(googles V8 VM)被认为具有反应性。这是因为在nodejs进程中只有一个线程在运行。因此,长时间运行的IO操作在其自己的进程中执行,并与触发IO访问的程序并行执行。

这意味着如果你执行db.collection.find({}, callback); vm请求mongodb进程搜索数据,然后将控制返回给调用programm / function,执行下一个语句然后执行下一个语句,依此类推。由于数据库搜索的持续时间比对变量的赋值持续时间长,因此添加的值未定义。

一旦DB返回搜索结果,它就会执行spezified callback并将错误变量和结果变量传递给它。您可以使用回调来将find方法与调用方同步。即,当确定数据可用时,执行回调内部的send方法。

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

...
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);
   });
});

然后,只要数据可用,就会发送请求。

同步对于您的示例很容易,但只要您使用返回的数据启动对数据库的新异步请求并使用返回数据启动...那么最好向我们提供一个像{一样的同步框架{1}}或承诺由Kris Kowalskis async处理。

相关问题