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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:04