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

MongoDB投影操作如何将文档数组转为id为键的键值对象

MongoDB 聚合转换实现方法

$arrayToObject 操作符的强制要求是:传入的数组每个元素必须包含k(对应输出对象的键名)、v(对应键的值)两个字段,用法错误基本都是缺少了这层结构映射。

聚合管道直接输出目标结构(推荐)

在你原有聚合逻辑的末尾追加两个阶段即可,Node.js驱动下的完整写法示例:

const pipeline = [
  // 此处替换为你原有的匹配、查询、分组等聚合阶段,输出结果为你贴出的{id, amounts}结构文档流
  // 阶段1:将所有结果收集为数组,同时映射为arrayToObject要求的k-v结构
  {
    $group: {
      _id: null,
      res: {
        $push: {
          k: "$id",
          v: "$amounts"
        }
      }
    }
  },
  // 阶段2:将k-v数组转换为目标对象,作为最终结果输出
  {
    $replaceRoot: {
      newRoot: { $arrayToObject: "$res" }
    }
  }
]

// 调用查询
const result = await yourCollection.aggregate(pipeline).toArray()
// result[0] 即为你需要的结构:{"0x3c93": [ 10, 20, 30 ], "0xee10": [ 0, 0, 100 ]}

Node.js侧直接转换(无需修改聚合逻辑)

如果你已经拿到了查询返回的原始数组,不需要调整数据库查询逻辑,直接用JS原生方法转换即可:

// rawResult 为MongoDB返回的原始数组:[{ amounts: [ 10, 20, 30 ], id: "0x3c93" }, ...]
const targetObj = Object.fromEntries(rawResult.map(item => [item.id, item.amounts]))

注意:$arrayToObject 仅支持MongoDB 3.4.4及以上版本,低版本直接使用JS侧转换方案即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:15:42