首页 > 解决方案 > 第二个 $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的是该文件和所有其他文件。

标签: mongodbaggregation-framework

解决方案


有可能在到达第二个$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" 
                    ] }
                ] }
            ]
        }
    }
})

推荐阅读