Faktisk kan du ganske enkelt gøre:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Siden MongoDB 3.2 kan du faktisk $project
med $sum
og en matrix af argumenter ( eller en matrix ) og behøver derfor ikke $unwind
overhovedet.
Den "lange" vej, som er den "gamle" måde, er faktisk at bruge $unwind
, men du ville faktisk tilføje et $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" ] }
}}
])
Og så har du selvfølgelig brug for $first
akkumulator for at returnere "price"
feltet fra $group
trin, så det kan bruges i det følgende trin.
Men hvis du kan gøre preserveNullAndEmptyArrays
, så har du faktisk MongoDB 3.2, og derfor er det bedre at bruge sætningen uden $unwind
overhovedet, da det er meget hurtigere at gøre det på den måde.