【问题标题】:Second $project Stage Producing Unexpected Result in MongoDB Aggregation第二个 $project 阶段在 MongoDB 聚合中产生意外结果
【发布时间】:2019-01-06 18:39:54
【问题描述】:

我正在尝试在我的 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 阶段之后,所有文档的“totalScore”值都为null

我应该得到的是'workloadSatisfactionScore' 的值,加到 10。但正如我所说,对于所有文档,我得到的只是null。这里有什么不正确的地方?

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

【问题讨论】:

  • 你试过totalScore: { $add: [ "$workloadSatisfactionScore", 10 ] }而不是$sum吗?
  • 是的,我做到了。结果相同。

标签: mongodb aggregation-framework


【解决方案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" 
                    ] }
                ] }
            ]
        }
    }
})

【讨论】:

  • 行得通!非常感谢,@chridam。这更简洁。这就是说 - 只是好奇 - 是否有任何理由说明第一个示例不起作用 - 原则上?
  • 编辑了我的答案以包含可能的原因
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多