Eigenlijk kun je gewoon doen:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Sinds MongoDB 3.2 kun je eigenlijk $project
met $sum
en een array van argumenten ( of een array ) en hoeven daarom niet te $unwind
helemaal niet.
De "lange" manier, wat de "oude" manier is, is om daadwerkelijk $unwind
, maar je zou dan eigenlijk een $project
volgens de $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" ] }
}}
])
En natuurlijk heb je dan de $first
nodig
accumulator om de "prijs"
. te retourneren veld uit de $group
stadium zodat het in het volgende stadium kan worden gebruikt.
Maar als je preserveNullAndEmptyArrays
. kunt doen , dan heb je eigenlijk MongoDB 3.2 en kun je daarom beter het statement zonder gebruiken de $unwind
helemaal niet, omdat het veel sneller is om het op die manier te doen.