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

MongoDB如何按groupId统计infos子数组总长度及解决内存超限问题

MongoDB按groupId统计infos子数组总长度解决方案

问题背景

我们需要对infos集合按groupId维度统计所有嵌套的infos子数组的总长度,示例数据期望输出为:

1111, 3
2222, 6

原有查询存在两个核心问题:

  • 直接取$tracks.infos得到的是嵌套数组(因为tracks本身是数组),无法直接统计长度
  • 分组时使用$push存储所有数组内容,数据量大时会超出内存限制,触发ExceededMemoryLimit报错

正确查询语句

db.infos.aggregate([
  // 先计算单条文档内所有infos子数组的总长度
  {
    $project: {
      groupId: 1,
      singleDocInfoCount: {
        $reduce: {
          input: "$tracks",
          initialValue: 0,
          in: { $add: ["$$value", { $size: "$$this.infos" }] }
        }
      }
    }
  },
  // 按groupId分组累加总长度
  {
    $group: {
      _id: "$groupId",
      totalInfoCount: { $sum: "$singleDocInfoCount" }
    }
  },
  // 可选:格式化输出字段和顺序
  {
    $project: {
      _id: 0,
      groupId: "$_id",
      totalInfoCount: 1
    }
  }
], { allowDiskUse: true })

方案说明

  • 第一步使用$reduce遍历每条文档的tracks数组,累加每个track下infos数组的长度,直接得到单条文档内的infos总数量,避免存储整个数组内容
  • 第二步分组时仅对数值进行累加,没有大数组存储操作,内存占用极低,不会触发内存超限报错
  • 测试匹配示例数据输出:
    • groupId为1111时总长度为3
    • groupId为2222时总长度为3+3=6,完全符合预期

内容的提问来源于stack exchange,提问作者pal.nag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 19:33:02