如何在MongoDB中按两个关联字段正确分组并合并数据
解决方案
你可以通过MongoDB聚合管道实现需求,核心逻辑是统一分组键:将存在associatedField的文档的分组键设为associatedField的值,无该字段的文档分组键设为自身field的值,保证有关联的文档进入同一分组。
完整聚合语句
db.collection.aggregate([ // 1. 构造统一分组键 { $addFields: { groupKey: { $cond: { if: { $ne: ["$associatedField", undefined] }, then: "$associatedField", else: "$field" } } } }, // 2. 按groupKey分组,合并数据 { $group: { _id: "$groupKey", fields: { $push: "$field" }, data: { $push: "$data" } } }, // 3. 扁平化data数组,处理字段格式 { $project: { _id: 0, field: "$_id", associatedField: { $first: { $filter: { input: "$fields", cond: { $ne: ["$$this", "$_id"] } } } }, data: { $reduce: { input: "$data", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] } } } } }, // 4. 移除无关联文档的空associatedField字段 { $replaceRoot: { newRoot: { $cond: { if: { $eq: ["$associatedField", null] }, then: { field: "$field", data: "$data" }, else: "$$ROOT" } } } } ])
逻辑说明
$addFields阶段生成统一分组键,确保有关联的文档被分到同一个组$group阶段收集组内所有field值和data数组内容$project阶段将嵌套的数组合并为一维数组,同时提取关联的associatedField值- 最后一个阶段可选,用于适配无关联文档的输出格式,自动移除值为null的
associatedField字段
内容的提问来源于stack exchange,提问作者Teo Tns
相关产品推荐
相关产品推荐

