我试图计算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
中添加一个新字段,仅在阶段结束后存在
我建议的两个解决方案是
- 增加一个
$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]}
}}
- 计算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。(在这种情况下,第一个会更快)
如果它不是懒惰的,第二个看起来更快。