0

0

MongoDB Aggregation: 正确计算数组元素的总和

花韻仙語

花韻仙語

发布时间:2025-07-12 18:24:18

|

871人浏览过

|

来源于php中文网

原创

mongodb aggregation: 正确计算数组元素的总和

本文旨在解决 MongoDB aggregation 中使用 $sum 操作符计算数组元素总和时返回 0 的问题。通过分析问题原因,并提供使用 $map 和 $reduce 操作符的解决方案,帮助开发者正确地计算数组元素的总和。

在 MongoDB 的 aggregation pipeline 中,使用 $sum 操作符计算数组元素的总和时,有时会遇到返回 0 的情况,这通常是由于对数组的直接求和方式不正确导致的。本文将深入探讨这个问题,并提供有效的解决方案,帮助开发者正确地计算数组元素的总和。

问题分析

当直接使用 $sum 操作符对嵌套在数组中的数组进行求和时,例如 $dailyNotes.individual,MongoDB 可能会无法正确识别需要求和的数组元素,从而返回 0。这是因为 $sum 默认的行为是尝试将整个数组作为一个单一的值进行处理,而不是迭代数组中的每个元素。

解决方案:使用 $map 操作符

$map 操作符可以遍历数组中的每个元素,并对每个元素执行指定的表达式。结合 $sum 操作符,我们可以对数组中的每个子文档的 individual 数组进行求和。

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      dailyNotes: {
        $map: {
          input: "$dailyNotes",
          in: { individual: { $sum: "$$this.individual" } }
        }
      }
    }
  }
])

代码解释:

Img.Upscaler
Img.Upscaler

免费的AI图片放大工具

下载
  1. $project 阶段用于选择需要返回的字段,并创建新的计算字段。
  2. $map 操作符遍历 dailyNotes 数组中的每个元素。
  3. input: "$dailyNotes" 指定了需要遍历的数组。
  4. in: { individual: { $sum: "$$this.individual" } } 定义了对每个数组元素执行的操作。$$this 代表当前遍历的数组元素,$$this.individual 则代表当前元素的 individual 数组。$sum 操作符对 individual 数组中的元素进行求和,并将结果赋值给新的 individual 字段。

替代方案:使用 $reduce 操作符

$reduce 操作符也可以用于遍历数组并进行累积计算。

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      dailyNotes: {
        $reduce: {
          input: "$dailyNotes",
          initialValue: [],
          in: { $concatArrays: [ "$$value", [ { individual: { $sum: "$$this.individual" } } ] ] }
        }
      }
    }
  }
])

代码解释:

  1. $project 阶段用于选择需要返回的字段,并创建新的计算字段。
  2. $reduce 操作符遍历 dailyNotes 数组中的每个元素。
  3. input: "$dailyNotes" 指定了需要遍历的数组。
  4. initialValue: [] 指定了累积器的初始值,这里是一个空数组。
  5. in: { $concatArrays: [ "$$value", [ { individual: { $sum: "$$this.individual" } } ] ] } 定义了对每个数组元素执行的操作。$$value 代表累积器的当前值,$$this 代表当前遍历的数组元素。$sum 操作符对 $$this.individual 数组中的元素进行求和,并将结果包装成一个包含 individual 字段的对象,然后使用 $concatArrays 操作符将该对象添加到累积器数组中。

总结

通过使用 $map 或 $reduce 操作符,我们可以有效地遍历数组中的每个元素,并结合 $sum 操作符正确地计算数组元素的总和。选择哪种方法取决于具体的需求和个人偏好。$map 操作符通常更简洁易懂,而 $reduce 操作符则更灵活,可以进行更复杂的累积计算。在实际应用中,应根据数据结构和业务逻辑选择最合适的方案。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

1

2025.12.22

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

73

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

23

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

36

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

31

2025.11.27

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.24

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.07.18

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 1.6万人学习

黑马云课堂mongodb实操视频教程
黑马云课堂mongodb实操视频教程

共11课时 | 3.1万人学习

MongoDB 教程
MongoDB 教程

共42课时 | 22.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号