Egentligen kan du helt enkelt göra:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Sedan MongoDB 3.2 kan du faktiskt $project
med $sum
och en array av argument ( eller en array ) och behöver därför inte $unwind
överhuvudtaget.
Den "långa" vägen, som är det "gamla" sättet är att faktiskt använda $unwind
, men du skulle då faktiskt lägga till ett $project
efter $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" ] }
}}
])
Och naturligtvis behöver du sedan $first
ackumulator för att returnera "price"
fältet från $group
steg så att det kan användas i nästa steg.
Men om du kan göra preserveNullAndEmptyArrays
, då har du faktiskt MongoDB 3.2, och därför är det bättre att använda satsen utan $unwind
alls, eftersom det går mycket snabbare att göra det på det sättet.