In realtà puoi semplicemente fare:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Da MongoDB 3.2 puoi effettivamente $project
con $sum
e un array di argomenti (o un array) e quindi non è necessario $unwind
affatto.
Il metodo "lungo", che è il "vecchio", consiste nell'utilizzare effettivamente $unwind
, ma aggiungeresti effettivamente un $project
seguendo il $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" ] }
}}
])
E ovviamente hai bisogno di $first
accumulatore per restituire il "price"
campo dal $group
fase in modo che possa essere utilizzata nella fase successiva.
Ma se riesci a fare preserveNullAndEmptyArrays
, allora hai effettivamente MongoDB 3.2, e quindi è meglio usare l'istruzione senza il $unwind
affatto, dal momento che è molto più veloce farlo in questo modo.