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

如何在MongoDB中查询文档并生成指定格式的键值对结果?

MongoDB 按关联用户聚合文档ID的实现方案

需要从resultInDB集合中查询数据,最终将所有出现在owners或stakeholders字段中的用户作为键,每个键对应的值是包含该用户关联的所有文档_id数组的对象。

示例数据

resultInDB:
[
  {
    _id: 1,
    owners: ["johnDoe", "michael"],
    stakeholders: ["johnDoe", "david"]
  },
  {
    _id: 2,
    owners: ["michael"],
    stakeholders: ["michael", "david"]
  }
]

期望输出

{
  "johnDoe": { _id: [1] },
  "michael": { _id: [1, 2] },
  "david": { _id: [1, 2] }
}

实现方案

使用MongoDB聚合管道可直接在数据库层面完成格式转换,具体管道代码如下:

db.resultInDB.aggregate([
  // 合并owners和stakeholders为去重后的用户数组,保留原文档_id
  {
    $project: {
      users: { $setUnion: ["$owners", "$stakeholders"] },
      _id: 1
    }
  },
  // 将用户数组拆分为单个用户的文档
  { $unwind: "$users" },
  // 按用户分组,收集所有关联的文档_id
  {
    $group: {
      _id: "$users",
      ids: { $push: "$_id" }
    }
  },
  // 重组为{ 用户名: { _id: [ids] } }的结构
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[{ k: "$_id", v: { _id: "$ids" } }]]
      }
    }
  },
  // 合并所有用户结果为单个文档(可选,若需单文档输出则添加)
  {
    $group: {
      _id: null,
      result: { $mergeObjects: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$result" } }
])

步骤说明

  1. $project + $setUnion:合并每个文档的owners和stakeholders字段,去除同一文档内的重复用户,同时保留原文档的_id。
  2. $unwind:将用户数组拆分为独立文档,每个文档对应一个用户和原文档的_id。
  3. $group:以用户名为分组键,将所有关联的文档_id收集到数组中。
  4. $replaceRoot + $arrayToObject:把分组结果转换为目标键值对格式。
  5. 可选合并步骤:如果需要将所有用户的结果合并成单个文档返回,添加最后两步聚合操作;若不需要,可省略这两步,此时会得到每个用户单独一行的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:05:20