在mongodb条件下使用投影字段



我试图计算mongodb聚合框架的东西。所以我需要在另一个条件下使用投影项(这是投影阶段的计算字段),但我无法得到结果。

这是我尝试的代码。

"$project": {
"currency": {"$ifNull": ["$voucher_foreign_amount.symbol", "NOT ENTERED" ]},
"amount": {"$cond": [{"$not": ["$voucher_foreign_amount"]}, "$voucher_amount", "$voucher_foreign_amount.amount"]},
"voucher_type": 1,
"voucher_payment_type": 1,
"voucher_foreign_amount": 1,
"station": 1,
"paid": {"$cond": [{"$eq": ["$voucher_type",  "Paid"]}, "$amount", 1]}

}

在这个投影中,我不能得到报酬字段,在我看来,这是因为最后一个条件,不识别&;$amount&;

那么,如何在另一个字段生成中使用amount字段呢?

$project/$set=$addFields中添加一个新字段,仅在阶段结束后存在

我建议的两个解决方案是

  1. 增加一个$set
{"$set" : {"amount" : {"$cond": [{"$not": ["$voucher_foreign_amount"]}, "$voucher_amount", "$voucher_foreign_amount.amount"]}}},
{"$project": {
"currency": {"$ifNull": ["$voucher_foreign_amount.symbol", "NOT ENTERED" ]},
"amount" : 1,
"voucher_type": 1,
"voucher_payment_type": 1,
"voucher_foreign_amount": 1,
"station": 1,
"paid": {"$cond": [{"$eq": ["$voucher_type",  "Paid"]}, "$amount", 1]}
}}
  1. 计算2次
{
"$project": {
"currency": {"$ifNull": ["$voucher_foreign_amount.symbol", "NOT ENTERED" ]},
"amount": {"$cond": [{"$not": ["$voucher_foreign_amount"]}, "$voucher_amount", "$voucher_foreign_amount.amount"]},
"voucher_type": 1,
"voucher_payment_type": 1,
"voucher_foreign_amount": 1,
"station": 1,
"paid": {"$cond": [{"$eq": ["$voucher_type",  "Paid"]},
{"$cond": [{"$not": ["$voucher_foreign_amount"]}, "$voucher_amount", "$voucher_foreign_amount.amount"]},
1]}
}
}

你也可以用2个项目来做,但我认为只有1个字段的1个$set更简单。

关于性能,我不知道MongoDB将如何执行它们(我在过去测试过,我认为它优化了它(我测试了多个$map)),例如,它可能是懒惰的,而不是计算$amount,除非它的值是需要的,所以这2个阶段将在内部看起来为1。(在这种情况下,第一个会更快)

如果它不是懒惰的,第二个看起来更快。

相关内容

  • 没有找到相关文章