MongoDB按嵌套LevelDetails内部元素分组 统计各用户各层级金额总和
实现方案
你可以使用MongoDB聚合管道完成该统计需求,完整查询代码如下:
db.collection.aggregate([ // 1. 将LevelDetails对象转换为数组,方便遍历每个层级 { $project: { levels: { $objectToArray: "$LevelDetails" } } }, // 2. 拆分数组,每个文档对应单一层级的记录 { $unwind: "$levels" }, // 3. 按用户ID分组,分别累加三个层级的总金额 { $group: { _id: "$levels.v.userId", TotalLevel1Amount: { $sum: { $cond: [{ $eq: ["$levels.k", "level1"] }, "$levels.v.amount", 0] } }, TotalLevel2Amount: { $sum: { $cond: [{ $eq: ["$levels.k", "level2"] }, "$levels.v.amount", 0] } }, TotalLevel3Amount: { $sum: { $cond: [{ $eq: ["$levels.k", "level3"] }, "$levels.v.amount", 0] } } } }, // 4. 调整输出格式匹配要求 { $replaceRoot: { newRoot: { $arrayToObject: [ [ { k: { $concat: ["userId", { $toString: "$_id" }] }, v: { TotalLevel1Amount: "$TotalLevel1Amount", TotalLevel2Amount: "$TotalLevel2Amount", TotalLevel3Amount: "$TotalLevel3Amount" } } ] ] } } } ])
逻辑说明
- 首先用
$objectToArray把嵌套的LevelDetails对象转为数组,方便后续遍历处理每个层级的信息 - 用
$unwind拆分数组,让每一条文档对应单一层级的用户金额记录 - 分组阶段用
$cond条件判断,对应层级的金额才会被累加,其余情况加0,天然满足没有对应层级记录时金额为0的需求 - 最后用
$replaceRoot和$arrayToObject调整输出的字段结构,和要求的返回格式完全一致
内容的提问来源于stack exchange,提问作者sanu
相关产品推荐
相关产品推荐

