mongodb - 第二个 $project 阶段在 MongoDB 聚合中产生意外结果
问题描述
我试图在我的 MongoDB 后端运行一些聚合,在其中计算一个值,然后将该计算值添加到另一个值。第一步是有效的,但第二步会产生一个值null
,我试图理解为什么以及如何解决它。
这是我的聚合的样子:
db.staff.aggregate({
$project: {
_id: 1,
"workloadSatisfactionScore": {
$cond: [ { $eq: [ "$workload.shiftAvg", 0 ] }, "N/A", { $divide: [ "$workload.shiftAvg", "$workload.weeklyShiftRequest.minimum" ] } ]
}
},
$project: {
_id: 1,
totalScore: {
$sum: [ "$workloadSatisfactionScore", 10 ]
},
}
})
即使第一$project
阶段生成具有数字结果或null
“workloadSatisfactionScore”的文档,但在第二$project
阶段之后,所有文档都具有null
“totalScore”的值。
我应该得到的是'workloadSatisfactionScore'的值,加到10。但正如我所说,我得到的只是null
所有文档。这里看起来不正确的是什么?
例如,我的集合中的一个特定文档返回0.9166666666666666
“workloadSatisfactionScore”的值。因此,当将其插入第二$project
阶段时,我期望10.9166666666666666
“totalScore”的值为。但是,正如我所说,我得到null
的是该文件和所有其他文件。
解决方案
有可能在到达第二个$project
管道时,workloadSatisfactionScore
可能是一个字符串,即其值在或与非数字值一起使用"N/A"
时将导致 null 。$add
$sum
不需要第二个项目管道,您可以在另一个处理非数字部分的条件中添加值,而无需将其传递到管道中:
db.staff.aggregate({
"$project": {
"_id": 1,
"totalScore": {
"$cond": [
{ "$eq": [ "$workload.shiftAvg", 0 ] },
"N/A",
{ "$add": [
10,
{ "$divide": [
"$workload.shiftAvg",
"$workload.weeklyShiftRequest.minimum"
] }
] }
]
}
}
})
推荐阅读
- windows - 基于 Chromium Edge 的 WebView2(对象未设置为对象的实例)
- git - 如果我可以很好地 ping github,为什么 git fetch 需要很长时间?
- eclipse - ARM Development Studio IDE (Eclipse) 保存最后一个工作区路径在哪里
- ios - 解析json时无法将数据设置为变量
- grafana - 将蝗虫数据保存到influxdb
- java - 如何在一个程序中组合 jar 文件和 .sql 文件
- reactjs - 使用 antv g2plot 反应酶开玩笑测试用例失败
- collections - 在 F# 中展平地图的地图
- html - 在 amp-html 中滚动到顶部时运行动画
- python - 我无法导入 tensorflow 和 tflearn