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

如何在Mongo聚合管道中将查询结果合并为_id映射legacy_id的单文档

问题:用Mongo聚合管道将多文档合并为_id与legacy_id的键值对文档

我的Mongo集合items查询结果如下:

db.items.find({})

返回数据:

[
  {
    "_id": { "$oid": "64e929386a2bff904d86118a" },
    "name": "Copies",
    "legacy_id": 181
  },
  {
    "_id": { "$oid": "64e929386a2bff904d86118b" },
    "name": "Temp",
    "legacy_id": 182
  },
  {
    "_id": { "$oid": "64e929386a2bff904d86118c" },
    "name": "Test",
    "legacy_id": 183
  }
]

需要通过聚合管道直接将上述结果合并为单个文档,文档中以_id的字符串值为键,对应的legacy_id为值,期望结果如下:

[
  {
    "64e929386a2bff904d86118a": 181,
    "64e929386a2bff904d86118b": 182,
    "64e929386a2bff904d86118c": 183
  }
]

解决方案

可以通过以下聚合管道实现:

db.items.aggregate([
  // 1. 将ObjectId类型的_id转为字符串,生成键值对结构的对象
  {
    $project: {
      _id: 0,
      kv: {
        k: { $toString: "$_id" },
        v: "$legacy_id"
      }
    }
  },
  // 2. 将所有文档的键值对收集到一个数组中
  {
    $group: {
      _id: null,
      keyValues: { $push: "$kv" }
    }
  },
  // 3. 将数组转为对象,替换为根文档
  {
    $replaceRoot: {
      newRoot: { $arrayToObject: "$keyValues" }
    }
  }
])

各阶段说明

  • $project:转换_id为字符串格式,构造{k: 键名, v: 键值}的结构,同时剔除不需要的字段。
  • $group:以null为分组键,将所有文档的kv对象收集到keyValues数组中。
  • $replaceRoot:使用$arrayToObject将数组转换为目标键值对对象,并设为根文档。

执行上述聚合命令后,即可得到期望的单个文档结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:06:03