MongoDB如何统计文档中score数组内所有对象的catches数组总长度
MongoDB统计score数组中catches总长度的实现方案
错误原因说明
你之前的写法无法得到正确结果的原因是:$score.catches 会返回由所有score子文档的catches数组组成的二维数组,直接用$size统计只会得到score数组的元素个数,而非所有catches数组的长度总和。
正确聚合实现
你可以通过$map遍历每个score元素,统计每个catches的长度后再用$sum求和,示例语句如下:
db.yourCollectionName.aggregate([ { $project: { // 保留需要返回的原字段,比如球员名、赛事ID playerName: 1, tournamentId: 1, totalCatches: { $sum: { $map: { input: "$score", in: { $size: "$$this.catches" } } } } } } ])
如果你需要统计集合内所有文档的全局总接球数,可以额外增加$group阶段:
db.yourCollectionName.aggregate([ { $project: { catchPerDoc: { $sum: { $map: { input: "$score", in: { $size: "$$this.catches" } } } } } }, { $group: { _id: null, globalTotalCatches: { $sum: "$catchPerDoc" } } } ])
运算符说明
$map:遍历score数组的每一个元素,对每个元素执行in字段定义的逻辑$$this:指向当前遍历到的score子元素$size:统计每个子元素中catches数组的长度$sum:将所有catches数组的长度累加得到最终总和
针对你给出的示例文档,执行上述单文档统计聚合后,得到的totalCatches结果为1,和实际数据情况一致。
内容的提问来源于stack exchange,提问作者Muhammad Danyal
相关产品推荐
相关产品推荐

