我正在尝试将聚合管道内的对象内的两个金额相加。
这是我的沙箱:https://mongoplayground.net/p/LIvksL-UGur
文件:
[
{
"result": {
"invoices": [
{
"product": "baseball",
"amount": 4,
"tax": 1
},
{
"product": "basketball",
"amount": 10,
"tax": 2
}
]
}
}
]
我希望结果是:
[
{
"result": {
"invoices": [
{
"product": "baseball",
"amount": 4,
"tax": 1,
"total": 5
},
{
"product": "basketball",
"amount": 10,
"tax": 2,
"total": 12
}
]
}
}
]
这是我认为可行的:
db.collection.aggregate([
{
$set: {
"result.invoices": {
"total": "$result.invoices.amount + $result.invoices.tax"
}
}
}
])
总数是空的,因为它试图添加两个数组,我通过尝试这个来理解:
db.collection.aggregate([
{
$set: {
"result.invoices": {
"total": "$result.invoices.amount"
}
}
}
])
...这给出了这个:
[
{
"result": {
"invoices": [
{
"product": "baseball",
"amount": 4,
"tax": 1,
"total": [
4,
10
]
},
{
"product": "basketball",
"amount": 10,
"tax": 2,
"total": [
4,
10
]
}
]
}
}
]
我该如何做才是正确的?
注意:我意识到这是一个非常简单的例子,我可以在得到结果后添加计算。这只是说明了我正在尝试解决的一个更复杂的问题。
为了达到为发票数组中的每个项目添加金额和税费的预期结果,您需要在 MongoDB 聚合管道的 $addFields 或 $set 阶段中使用 $map 运算符。该运算符允许您转换数组中的每个项目。
这是修改后的聚合管道,应该适合您的场景:
db.collection.aggregate([
{
$set: {
"result.invoices": {
$map: {
input: "$result.invoices",
as: "invoice",
in: {
product: "$$invoice.product",
amount: "$$invoice.amount",
tax: "$$invoice.tax",
total: { $add: ["$$invoice.amount", "$$invoice.tax"] }
}
}
}
}
}
])
说明:
此管道将为发票数组中的每个对象添加一个总计字段,其中包含金额和税金的总和。