You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:39:03