gpt4 book ai didi

javascript - NodeJS 中的嵌套 MongoDB 查询

转载 作者:可可西里 更新时间:2023-11-01 10:00:24 24 4
gpt4 key购买 nike

我想使用 NodeJS 从 MongoDB 的两个集合中进行选择。我从 chat_messages 集合中选择,有一个 userId 属性,我想在 ES6 Promise 的帮助下用用户名扩展结果对象。我试过这个:

db.collection("chat_messages")
.find({"room" : roomName})
.sort({"created" : 1})
.toArray()
.then(function(messages){
console.log(messages);
return Promise.all(messages.map(function(message){
return db.collection("chat_users")
.find({"id" : message.userId})
.limit(1)
.toArray()
.then(function(users){
message.userName = users[0].name;
});
}));
})
.then(function(messages){
console.log(messages);
})
.catch(function(error){
// ...
});

第一个 console.log 打印如下:

[
{
_id: 573b6f2af9172fd81252c520,
userId: 2,
...
},
{
_id: 57388bd913371cfc13323bbb,
userId: 1,
...
}
]

但是第二个看起来像这样:

[ undefined, undefined ]

我搞砸了什么?

最佳答案

Promise.all 返回传递给 promise 的解析函数的数据。这应该有效

db.collection("chat_messages")
.find({"room" : roomName})
.sort({"created" : 1})
.toArray()
.then(function(messages){
let promises = [];

messages.forEach(message => {
promises.push(new Promise(resolve => {
db.collection("chat_users")
.find({"id" : message.userId})
.limit(1)
.toArray()
.then(function(users){
message.userName = users[0].name;
resolve(message);
});
}));
});
return Promise.all(promises);
})
.then(function(messages){
console.log(messages);
})
.catch(function(error){
// ...
});

关于javascript - NodeJS 中的嵌套 MongoDB 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37332205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com