如何在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" } } ])
步骤说明
- $project + $setUnion:合并每个文档的
owners和stakeholders字段,去除同一文档内的重复用户,同时保留原文档的_id。 - $unwind:将用户数组拆分为独立文档,每个文档对应一个用户和原文档的
_id。 - $group:以用户名为分组键,将所有关联的文档
_id收集到数组中。 - $replaceRoot + $arrayToObject:把分组结果转换为目标键值对格式。
- 可选合并步骤:如果需要将所有用户的结果合并成单个文档返回,添加最后两步聚合操作;若不需要,可省略这两步,此时会得到每个用户单独一行的结果。
内容的提问来源于stack exchange,提问作者soap_mctavish
相关产品推荐
相关产品推荐

