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

标签 javascript node.js mongodb mongoskin

我有一个如下所示的代码块。我找不到如何实现这一目标。
- 我在 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"} ]

谢谢

最佳答案

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

});

关于javascript - NodeJs MongoDB 嵌套查询 - 同步运行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30591684/

相关文章:

mongodb - 在 mongodb-go-driver 中,如何将 BSON 编码/解码到结构中

javascript - for循环nodeJS中的Mongo查询

javascript - 如何在javascript find函数中传递参数?

node.js - 为什么 firestore 文档不创建也不更新数据?

javascript - Gmail API Node js-gapi未定义

node.js - 运行 Node 应用程序时带有环境变量的 Docker CMD

javascript - Mean.js Node.js 后台进程

javascript - 如果不满足最小最大范围,模式对话框中的输入文本验证会提示

javascript - Extjs确认框回调处理

javascript - 使用 JQuery 启用和禁用点击事件