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
相关产品推荐
相关产品推荐

