NodeJs的MongoDB嵌套查询 – 同步运行callback

我有一个像下面的代码块。 我无法find如何实现这一目标。
– 我有mongodb中的房间集合,此集合中的文档包括用户标识数组。 每个房间可以有多个用户。
– 所以我想find包含我的用户ID的房间里的用户名。

数据库集合:
客房{roomId:1,用户:[99,100]},{roomId:2,用户:[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”}]

谢谢

在执行第二个.findcallback之前,您将返回res.json,因此它将为空。 在响应之前,您需要进行重构以等待所有asynchronouscallback,如下所示:

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