在NodeJS中嵌套MongoDB查询

我想用NodeJS从MongoDB中的两个集合中进行select。 我从chat_messages集合中select了一个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的parsing函数的数据。 这应该工作

 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){ // ... });