在mongodb条件下使用投影字段

mgdq6dx1  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(117)

我正在尝试使用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]}
   
}

在这个项目中,我不能得到支付领域,在我看来,这是因为最后一个条件,不承认“$金额”。
那么,我如何在另一个字段生成中使用金额字段?

wlwcrazw

wlwcrazw1#

我们添加的新字段$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.做两次计算

{
"$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,除非需要它的值,所以这两个阶段在内部看起来像1。(在这种情况下,第一个会更快)
如果它不懒惰,第二个看起来更快。

nbnkbykc

nbnkbykc2#

Photo.find({},{ book_id: 1, user_id: 1,  datetime: 1, userAgent: 1, createdAt: 1 })

相关问题