
本文介绍了如何使用 MongoDB 的聚合管道和 $sum 操作符来正确计算嵌套在数组中的整数的总和。重点讲解了在使用 $sum 时可能遇到的问题,并提供了使用 $map 和 $reduce 操作符的两种解决方案,并附带示例代码和 MongoDB Playground 链接,方便读者理解和实践。
在使用 MongoDB 的聚合管道时,经常需要计算数组中元素的总和。$sum 操作符是实现这一功能的关键。然而,当数组嵌套在文档的深层结构中时,直接使用 $sum 可能会导致意外的结果,例如返回 0 而不是实际的总和。本文将深入探讨这个问题,并提供两种有效的解决方案。
假设我们有如下结构的文档:
{
"_id": "2023-04-08",
"dailyNotes": [
{
"therapyDiscipline": "PT",
"individual": [
60,
45,
30,
75,
55
],
"concurrent": [
69
],
"coTreat": [
67
]
},
{
"therapyDiscipline": "YT",
"individual": [
2,
4
]
}
]
}我们的目标是计算 dailyNotes 数组中每个元素的 individual 数组的总和,并将其作为新的 individual 字段添加到 dailyNotes 数组的每个元素中。
如果直接使用 $sum 操作符,例如:
{
$group: {
_id: '$_id',
individual: {
$sum: '$dailyNotes.individual'
}
}
}或者:
{
$project: {
individual: {
$sum: '$dailyNotes.individual'
}
}
}可能会错误地返回 0。这是因为 $sum 操作符直接应用于 dailyNotes.individual 时,MongoDB 无法正确地遍历嵌套数组。
$map 操作符允许我们遍历数组中的每个元素,并对每个元素应用一个表达式。我们可以利用 $map 来遍历 dailyNotes 数组,并对每个元素的 individual 数组使用 $sum 操作符。
db.collection.aggregate([
{
$project: {
_id: 1,
dailyNotes: {
$map: {
input: "$dailyNotes",
in: { individual: { $sum: "$$this.individual" } }
}
}
}
}
])在这个聚合管道中:
$reduce 操作符也允许我们遍历数组,并将其归约为单个值。我们可以利用 $reduce 来遍历 dailyNotes 数组,并将每个元素的 individual 数组的总和添加到结果数组中。
db.collection.aggregate([
{
$project: {
_id: 1,
dailyNotes: {
$reduce: {
input: "$dailyNotes",
initialValue: [],
in: { $concatArrays: [ "$$value", [ { individual: { $sum: "$$this.individual" } } ] ] }
}
}
}
}
])在这个聚合管道中:
当需要计算嵌套在数组中的整数的总和时,直接使用 $sum 操作符可能无法得到正确的结果。使用 $map 或 $reduce 操作符可以有效地解决这个问题。$map 适用于直接转换数组中的每个元素,而 $reduce 适用于将数组归约为单个值。选择哪种方案取决于具体的需求和数据结构。在实际应用中,建议根据数据量和性能要求选择合适的方案。
以上就是MongoDB Aggregation:使用 $sum 正确计算数组中整数的总和的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号