简体   繁体   English

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

[英]NodeJs MongoDB Nested Queries - Run Callback Synchronously

I have a code block like below. 我有一个类似下面的代码块。 I could not find how to achieve that. 我找不到如何实现这一目标。
- I have rooms collection in mongodb and documents in this collection include user id array. -我在mongodb中有房间集合,并且此集合中的文档包括用户ID数组。 Each room can have multiple users. 每个房间可以有多个用户。
- So I want to find that usernames which are in the rooms that include my user Id. -所以我想找到包含我的用户ID的房间中的用户名。

DB collections: 数据库集合:
Rooms {roomId:1, users:[99, 100]}, {roomId:2, users:[99, 101]} 客房{roomId:1,用户:[99,100]},{roomId:2,用户:[99,101]}
Users {_id:99, name:"Alex"},{_id:100, name:"Harry"},{_id:101, name:"Tom"} 用户{_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(function(err, rooms) {

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

        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:rooms[i].roomId, name:strUserNames });
        });

    }

    res.json({rooms:arrRooms});
});

I want to have a result like that: 我想要这样的结果:
arrRooms: [ { _id:1:, name:"Alex, Harry" }, { _id:2:, name:"Alex, Tom" } ] arrRooms:[{_id:1 :,名称:“ Alex,Harry”},{_id:2 :,名称:“ Alex,Tom”}]

Thanks 谢谢

You're returning res.json before the second .find callback executes, so it will be empty. 您将在第二个.find回调执行之前返回res.json,因此它将为空。 You need to restructure to wait for all the async callbacks before responding, like so: 您需要重组以等待所有异步回调后再进行响应,如下所示:

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

});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM