第二个$ project阶段在MongoDB聚合中产生意外结果

时间:2018-07-30 13:34:53

标签: mongodb aggregation-framework

我试图在我的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阶段生成的数字结果为'workloadSatisfactionScore'或为null的文档,但在第二个$project阶段之后,所有文档的值均为{{1} }代表“ totalScore”。

我应该得到的是'workloadSatisfactionScore'的值加上10的值。但是正如我说的,我得到的是所有文档的null。这里看起来有什么不对?

例如,我集合中的一个特定文档为“ workloadSatisfactionScore”返回值null。因此,当将其插入第二个0.9166666666666666阶段时,我期望'totalScore'的值为$project。但是,正如我所说,我得到的是该文档和所有其他文档的10.9166666666666666

1 个答案:

答案 0 :(得分:1)

到第二个$project管道时,workloadSatisfactionScore可能是一个字符串,即值为"N/A",当$add$sum与非数字值一起使用。

不需要第二个项目管道,您可以将值添加到处理非数字部分的其他条件中,而无需将其传递给管道:

db.staff.aggregate({
    "$project": {
        "_id": 1,
        "totalScore": {
            "$cond": [ 
                { "$eq": [ "$workload.shiftAvg", 0 ] }, 
                "N/A",
                { "$add":  [
                    10,
                    { "$divide": [ 
                        "$workload.shiftAvg", 
                        "$workload.weeklyShiftRequest.minimum" 
                    ] }
                ] }
            ]
        }
    }
})