Node.js中如何将MongoDB返回的三个独立数组合并为一个一维数组
解决方案
你需要的二维数组转一维(扁平化)可以直接用JS内置的Array.prototype.flat()方法实现,该方法在Node.js v11及以上版本原生支持,默认只展开一层数组,完全匹配你的使用场景。
1. 最简修改方案(基于你现有代码优化)
你现有代码里额外包裹的new Promise属于冗余写法,myMongo.retrieveDocuments本身已经返回Promise实例,可以直接简化为:
function getUserGroups(userId) { const p1 = myMongo.retrieveDocuments('groups', { member: userId }); const p2 = myMongo.retrieveDocuments('groups', { owner: userId }); const p3 = myMongo.retrieveDocuments('groups', { admin: userId }); // 所有查询完成后调用flat()展开一层 return Promise.all([p1, p2, p3]).then(res => res.flat()); }
2. 低版本Node.js兼容方案
如果你的Node.js版本低于v11不支持flat(),可以用展开运算符+concat替代实现:
return Promise.all([p1, p2, p3]).then(res => [].concat(...res));
3. 去重优化(可选)
如果用户同时属于某个群组的多个身份(比如既是成员又是管理员),三次查询会返回重复的群组对象,可以通过群组_id去重:
return Promise.all([p1, p2, p3]).then(res => { const uniqueMap = new Map(res.flat().map(group => [group._id, group])); return Array.from(uniqueMap.values()); });
4. 更优的查询方案(推荐)
你完全可以用MongoDB的$or操作符实现单次查询拿到所有结果,无需发三次请求,也不用额外做扁平化处理,性能更高且天然去重:
function getUserGroups(userId) { return myMongo.retrieveDocuments('groups', { $or: [ { member: userId }, { owner: userId }, { admin: userId } ] }); }
内容的提问来源于stack exchange,提问作者EthanNeedsHelpCoding
相关产品推荐
相关产品推荐

