mongodb - Mongodb 字段总和存在
问题描述
我有以下集合,其中字段数量随时间变化。
{
"_id" : "9235@7421",
"usine" : { "0" : 0, "1" : 3, "2" : 1, "3" : 2, "4" : 0, "5" : 3, "6" : 1, "7" : 0, "8" : 2, "9" : 1 },
"ecole" : { "0" : 1, "1" : 0, "2" : 0, "3" : 1, "4" : 1, "5" : 0, "6" : 0, "7" : 1, "8" : 0, "9" : 1 }
}
以下查询工作正常。它计算所有字段的值的总和。
db.lieux.aggregate([
{
$match: {
"_id": "9235@7421"
}
},
{
$project: {
"MontoSum": {
$sum: {
$add: [
"$usine.0", "$usine.1", "$usine.2", "$usine.3", "$usine.4", "$usine.5", "$usine.6", "$usine.7", "$usine.8", "$usine.9", "$ecole.0", "$ecole.1", "$ecole.2", "$ecole.3", "$ecole.4", "$ecole.5", "$ecole.6", "$ecole.7", "$ecole.8", "$ecole.9"]
}
}
}
}
])
结果是:{ "_id" : "9235@7421", "MontoSum" : 18 }
这是正确的。
我的问题是:
1)有没有更好的方法来查询我的集合字段的值总和?我觉得我的查询太长了,一点也不聪明。
2)当文档缺少我的查询中的字段时(例如字段“6”丢失),返回值为 { "_id" : "9235@7421", "MontoSum" : 0 } 这是不正确的. 在我看来, sum 函数不喜欢缺少字段。在我的情况下如何使用类似 $ifNull 的东西?
非常感谢
解决方案
- 我们可以使用$objectToArray和$map等运算符来操作对象结构:
{
$project: {
"MontoSum": {
$sum: {
$concatArrays: [
{
$map: {
input: {$objectToArray: "$usine"},
as: "usine",
in: "$$usine.v"
}
},
{
$map: {
input: {$objectToArray: "$ecole"},
as: "ecole",
in: "$$ecole.v"
}
}
]
}
}
}
}
现在这不是最短的表达式,但它可以缩放。
- 使用这些运算符也将解决此问题,因为您正在对未定义的值求和导致意外行为。
推荐阅读
- algorithm - 建议纠正错误输入的算法?
- typescript - 如何将 Firestore DocumentReferences 数组映射到 DocumentData 数组?
- python - 有没有办法使用 xlwings API 在 excel 中命名一个范围?尝试使用引用 excel 定义范围的字符串公式
- javascript - 当我在页面上向下滚动时,即使我的鼠标在滚动后处于不同的位置,也不会触发 Eventlistener 'mousemove'
- html - 如何将复选框与表单中的其他输入控件垂直对齐?
- php - 数次加起来超过24小时
- reactjs - 为什么有些开发者在 React.js 的类中使用构造函数和 super?
- python - 如何将变量从 python 发送到 shell,然后发送到 hive?
- opengl - 在片段着色器中绘制别名像素完美线?
- .net - 是否可以在 Windows Sandbox 上安装 .NET 应用程序?