Javascript NodeJs MongoDB嵌套查询-同步运行回调
我有一个代码块,如下所示。我找不到如何做到这一点。Javascript NodeJs MongoDB嵌套查询-同步运行回调,javascript,node.js,mongodb,mongoskin,Javascript,Node.js,Mongodb,Mongoskin,我有一个代码块,如下所示。我找不到如何做到这一点。 -我在mongodb中有rooms集合,该集合中的文档包括用户id数组。每个房间可以有多个用户。 -所以我想找到包含我的用户Id的文件室中的用户名 数据库集合: 房间{roomId:1,用户:[99100]},{roomId:2,用户:[99101]} 用户{id:99,名称:“Alex”},{id:100,名称:“Harry”},{id:101,名称:“Tom”} var userId=99; var arrUserIds=[]; var a
-我在mongodb中有rooms集合,该集合中的文档包括用户id数组。每个房间可以有多个用户。
-所以我想找到包含我的用户Id的文件室中的用户名 数据库集合:
房间{roomId:1,用户:[99100]},{roomId:2,用户:[99101]}
用户{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(函数(err,rooms){
对于(var i=0;i您在执行第二个.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();
});
}
});
var userId=99;
var arrRooms=[];
var strUserNames=“”;
db.collection(“rooms”).find({“users.userId”:userId}).toArray(函数(err,rooms){
var完成=0;
var complete=function(){
已完成++;
如果(已完成===rooms.length-1){
res.json({rooms:arrhoms});
}
}
对于(var i=0;iI希望得到这样的结果:arrhooms:[{{u id:1:,name:“Alex,Harry”},{{u id:2:,name:“Alex,Tom”}]但是你的回答没有给出这个结果。我需要运行第二个。同步查找回调。啊,我明白了-我会再试一次。@barisusanmaz Update-这包括了吗?不,很抱歉它不起作用。这只提供了3个房间中的最后一个房间信息。@barisusanmaz最后一次尝试,我刚刚更新了答案;重置了arrUserIds数组在for循环内部。
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();
});
}
});