En fait, vous pouvez simplement faire :
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Depuis MongoDB 3.2, vous pouvez en fait $project
avec $sum
et un tableau d'arguments (ou un tableau) et n'ont donc pas besoin de $unwind
du tout.
La "longue", qui est l'"ancienne", consiste à utiliser $unwind
, mais vous ajouteriez alors en fait un $project
suivant le $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" ] }
}}
])
Et bien sûr, vous avez ensuite besoin du $first
accumulateur afin de retourner le "price"
champ du $group
afin qu'il puisse être utilisé dans l'étape suivante.
Mais si vous pouvez faire preserveNullAndEmptyArrays
, alors vous avez réellement MongoDB 3.2, et il vaut donc mieux utiliser l'instruction sans le $unwind
du tout, car c'est beaucoup plus rapide de le faire de cette façon.