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

Mongoose查询实现field数组对象合并:基于reduce逻辑的实现方案

聚合实现数组对象合并方案

要实现和field.reduce((p,c)=>({...p,...c}),{})完全等价的逻辑,直接用MongoDB自带的聚合管道就能完成,不需要额外把数据拉到应用层做手动处理。
核心用到两个聚合操作符:

  • $reduce:和JS原生reduce逻辑完全一致,用来遍历数组做累计计算
  • $mergeObjects:用来把多个对象做浅合并,后续对象的同名字段会覆盖前面对应的值,和JS展开运算符{...p, ...c}的合并规则一模一样
可直接复用的Mongoose聚合查询代码
// 替换成你实际的Mongoose模型
const result = await YourModel.aggregate([
  // 根据实际查询条件匹配目标文档,这里示例匹配_id为a的文档
  { $match: { _id: "a" } },
  {
    $project: {
      // 保留原文档的_id字段
      _id: 1,
      // 把field数组合并为单个对象
      field: {
        $reduce: {
          // 遍历目标field数组
          input: "$field",
          // 累计初始值为空对象,和JS reduce的初始值保持一致
          initialValue: {},
          // 每次循环把累计值和当前数组元素做合并
          in: { $mergeObjects: ["$$value", "$$this"] }
        }
      }
    }
  }
])
输出效果

执行上述查询后,拿到的结果结构完全符合预期:

{
  _id: "a",
  field: {
    _id: "ab",
    field2: "ab2",
    field1: "aa1"
  }
}

注意:如果field数组内存在重复字段,后续遍历到的元素的字段值会覆盖前面的同名字段,和JS对象展开的合并规则无差异;如果field为空数组,最终输出的field字段会是空对象{},不会触发运行时错误。


内容的提问来源于stack exchange,提问作者mehdi parastar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:15:11