Javascript NodeJs MongoDB嵌套查询-同步运行回调

Javascript NodeJs MongoDB嵌套查询-同步运行回调,javascript,node.js,mongodb,mongoskin,Javascript,Node.js,Mongodb,Mongoskin,我有一个代码块,如下所示。我找不到如何做到这一点。 -我在mongodb中有rooms集合,该集合中的文档包括用户id数组。每个房间可以有多个用户。 -所以我想找到包含我的用户Id的文件室中的用户名 数据库集合: 房间{roomId:1,用户:[99100]},{roomId:2,用户:[99101]} 用户{id:99,名称:“Alex”},{id:100,名称:“Harry”},{id:101,名称:“Tom”} var userId=99; var arrUserIds=[]; var a

我有一个代码块,如下所示。我找不到如何做到这一点。
-我在mongodb中有rooms集合,该集合中的文档包括用户id数组。每个房间可以有多个用户。
-所以我想找到包含我的用户Id的文件室中的用户名

数据库集合:
房间{roomId:1,用户:[99100]},{roomId:2,用户:[99101]}
用户{id:99,名称:“Alex”},{id:100,名称:“Harry”},{id:101,名称:“Tom”}

var userId=99;
var arrUserIds=[];
var arrRooms=[];
var strUserNames=“”;
db.collection(“rooms”).find({“users.userId”:userId}).toArray(函数(err,rooms){

对于(var i=0;i您在执行第二个.find回调之前返回res.json,因此它将为空。您需要在响应之前重新构造以等待所有异步回调,如下所示:

var userId = 99;
var arrRooms = [];
var strUserNames = "";

db.collection("rooms").find({"users.userId":userId}).toArray(function(err, rooms) {

    var completed = 0;
    var complete = function() {
        completed++;
        if (completed === rooms.length - 1) {
            res.json({rooms:arrRooms});
        }
    }


    for (var i=0; i<rooms.length; i++) {
        var arrUserIds = [];
        var roomId = rooms[i].roomId;

        for(var j=0; j<rooms[i].users.length; j++){
            arrUserIds.push(new BSON.ObjectID(rooms[i].users[j].userId));   
        }

        db.collection('users').find({"_id": {$in: arrUserIds}}).toArray(function(err, users) {
            strUserNames = users.map(function(elem){return elem.name;}).join(", ");
            arrRooms.push({_id:roomId, name:strUserNames });

            complete();
        });
    }

});
var userId=99;
var arrRooms=[];
var strUserNames=“”;
db.collection(“rooms”).find({“users.userId”:userId}).toArray(函数(err,rooms){
var完成=0;
var complete=function(){
已完成++;
如果(已完成===rooms.length-1){
res.json({rooms:arrhoms});
}
}

对于(var i=0;iI希望得到这样的结果:arrhooms:[{{u id:1:,name:“Alex,Harry”},{{u id:2:,name:“Alex,Tom”}]但是你的回答没有给出这个结果。我需要运行第二个。同步查找回调。啊,我明白了-我会再试一次。@barisusanmaz Update-这包括了吗?不,很抱歉它不起作用。这只提供了3个房间中的最后一个房间信息。@barisusanmaz最后一次尝试,我刚刚更新了答案;重置了arrUserIds数组在for循环内部。
var userId = 99;
var arrRooms = [];
var strUserNames = "";

db.collection("rooms").find({"users.userId":userId}).toArray(function(err, rooms) {

    var completed = 0;
    var complete = function() {
        completed++;
        if (completed === rooms.length - 1) {
            res.json({rooms:arrRooms});
        }
    }


    for (var i=0; i<rooms.length; i++) {
        var arrUserIds = [];
        var roomId = rooms[i].roomId;

        for(var j=0; j<rooms[i].users.length; j++){
            arrUserIds.push(new BSON.ObjectID(rooms[i].users[j].userId));   
        }

        db.collection('users').find({"_id": {$in: arrUserIds}}).toArray(function(err, users) {
            strUserNames = users.map(function(elem){return elem.name;}).join(", ");
            arrRooms.push({_id:roomId, name:strUserNames });

            complete();
        });
    }

});