簡體   English   中英

NodeJs MongoDB嵌套查詢-同步運行回調

[英]NodeJs MongoDB Nested Queries - Run Callback Synchronously

我有一個類似下面的代碼塊。 我找不到如何實現這一目標。
-我在mongodb中有房間集合,並且此集合中的文檔包括用戶ID數組。 每個房間可以有多個用戶。
-所以我想找到包含我的用戶ID的房間中的用戶名。

數據庫集合:
客房{roomId:1,用戶:[99,100]},{roomId:2,用戶:[99,101]}
用戶{_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});
});

我想要這樣的結果:
arrRooms:[{_id:1 :,名稱:“ Alex,Harry”},{_id:2 :,名稱:“ Alex,Tom”}]

謝謝

您將在第二個.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();
        });
    }

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM