【问题标题】:NodeJs MongoDB Nested Queries - Run Callback SynchronouslyNodeJs MongoDB 嵌套查询 - 同步运行回调
【发布时间】:2015-08-15 23:39:56
【问题描述】:

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

数据库集合:
房间 {roomId:1, users:[99, 100]}, {roomId:2, users:[99, 101]}
用户 {_id:99, name:"Alex"},{_id:100, name:"Harry"},{_id:101, name:"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:, name:"Alex, Harry" }, { _id:2:, name:"Alex, Tom" } ]

谢谢

【问题讨论】:

    标签: javascript node.js mongodb mongoskin


    【解决方案1】:

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

    【讨论】:

    • 我想要这样的结果:arrRooms: [{_id:1:, name:"Alex, Harry" },{_id:2:, name:"Alex, Tom" }]但是你的回答并没有给我这个结果。我需要同步运行第二个 .find 回调。
    • 啊,我明白了 - 我再试一次。
    • @barisusanmaz 已更新 - 是否涵盖了它?
    • 不,很抱歉它不起作用。这只能给我 3 个房间的最后一个房间信息。
    • @barisusanmaz 最后一次尝试,我刚刚更新了答案;在 for 循环中重置 arrUserIds 数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多