Ve skutečnosti můžete jednoduše:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Od MongoDB 3.2 můžete skutečně $project
s $sum
a pole argumentů (nebo pole), a proto není nutné $unwind
vůbec.
"Dlouhá" cesta, což je "stará" cesta, je skutečně použít $unwind
, ale ve skutečnosti byste přidali $project
podle $group
:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$group":
"_id": "$_id",
"price": { "$first": "$price" },
"deposits": { "$sum": "$deposits.amount" }
}},
{ "$project": {
"deposits": { "$subtract": [ "$price", "$deposits" ] }
}}
])
A samozřejmě pak potřebujete $first
akumulátor, aby se vrátila "price"
pole ze $group
fázi, takže ji lze použít v následující fázi.
Ale pokud můžete udělat preserveNullAndEmptyArrays
, pak ve skutečnosti máte MongoDB 3.2, a proto je lepší použít příkaz bez the $unwind
vůbec, protože je to mnohem rychlejší udělat to tímto způsobem.