在Node.JS中使用MongoDB中的数据填充数组

时间:2014-05-07 19:06:29

标签: node.js mongodb mongoose

我在引用Node.JS的异步行为时遇到了问题:

我正在尝试使用Mongo数据库中的数据填充数组并将其发送到页面。当然Array是空的,我想知道它是如何解决的。我已经搜索了关于保持控制流的信息,但是没有真正找到一个例子,如何处理嵌套的MongoDB查询或类似的东西:

Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){

        if(sessions){

            var lastSessionNotes=[];
            var numCompletedCalls = 0;

            for(var i=0;i<sessions.length;i++){


                Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){

                    var lastnotedate;
                    var lastNoteObject={};

                    if(typeof note[0]!='undefined'){

                        console.log(note);
                        lastnotedate=note[0].creation;

                        lastNoteObject={sessionID:note[0].sessionId,lastNote:lastnotedate};
                        lastSessionNotes.push(lastNoteObject);
                        numCompletedCalls=numCompletedCalls+1;

                    }

                });

            }


            console.log(lastSessionNotes.length);
            res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});


        }
    });

非常感谢提前

编辑:

我现在正在使用它,但是现在我遇到了问题,我的Array中有一个Object总是两次,不应该。 Notes.find-Query遍历Notes,按Date排序并返回最新的。

我真的没有得到它,当然如果我返回sessons [i],没有数组返回两次。

此处代码:

Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){

                if(sessions){

                    var lastSessionNotes=[];

                    var numCompletedCalls = 0;


                    for(var i=0;i<sessions.length;i++){

                        console.log(sessions[i]);
                        Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){

                            var lastnotedate;
                            var lastnotesessioniD;
                            var lastNoteObject={};

                            if(typeof note[0]=='undefined'){

                                lastnotedate="Nothing";
                                //console.log(sessions[numCompletedCalls]);
                                lastnotesessioniD=sessions[numCompletedCalls].uuid;


                            }else{

                                lastnotedate=note[0].creation;
                                lastnotesessioniD=note[0].sessionId;

                            }

                            lastNoteObject={sessionID:lastnotesessioniD,lastNote:lastnotedate};
                            lastSessionNotes.push(lastNoteObject);

                            numCompletedCalls=numCompletedCalls+1;
                            console.log(numCompletedCalls+"  "+sessions.length);

                            if (numCompletedCalls == sessions.length) {
                                console.log(lastSessionNotes);
                                res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});
                            }

                        });

                    }


                }

            });

输出:

[ { sessionID: 'Klz8g1', lastNote: 'Nothing' },
{ sessionID: 'Klz8g1', lastNote: 1399485395975 },
{ sessionID: 'Pcfu5Z', lastNote: 1399477346484 },
{ sessionID: 'D241jz', lastNote: 1399485746096 },
{ sessionID: 'EvgXE4', lastNote: 'Nothing' },
{ sessionID: '348oay', lastNote: 1399486524033 },
{ sessionID: 'qkFqPh', lastNote: 'Nothing' },
{ sessionID: 'UeY4c9', lastNote: 'Nothing' } ]

1 个答案:

答案 0 :(得分:0)

当你跟踪Notes.find中已完成的numCompletedCalls次操作的数量时,你已经很近了,但是你没有做任何事情。您需要在回调中移动res.render调用,并在numCompletedCalls显示所有操作都已完成时调用它。

Session.find({$or:[{owner:useremail},{users:{$in:[useremail]}}]},function(err,sessions){
    if(sessions){
        var lastSessionNotes=[];
        var numCompletedCalls = 0;

        for(var i=0;i<sessions.length;i++){
            Notes.find({sessionId:sessions[i].uuid}).sort({creation:-1}).limit(1).exec(function(err,note){
                var lastnotedate;
                var lastNoteObject={};

                if(typeof note[0]!='undefined'){
                    console.log(note);
                    lastnotedate=note[0].creation;

                    lastNoteObject={sessionID:note[0].sessionId,lastNote:lastnotedate};
                    lastSessionNotes.push(lastNoteObject);
                }

                numCompletedCalls=numCompletedCalls+1;                    
                if (numCompletedCalls === sessions.length) {
                    console.log(lastSessionNotes.length);
                    res.render('home',{username:req.session.user, sessions:sessions, lastSessionNotes:lastSessionNotes});
                }
            });
        }
    }
});