Właściwie możesz po prostu zrobić:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Od MongoDB 3.2 możesz właściwie $project
z $sum
i tablicę argumentów (lub tablicę) i dlatego nie trzeba $unwind
w ogóle.
„Długi” sposób, który jest „stary”, polega na użyciu $unwind
, ale w rzeczywistości dodałbyś $project
zgodnie z $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" ] }
}}
])
I oczywiście potrzebujesz wtedy $first
akumulator w celu zwrócenia "price"
pole z $group
etapie, aby można go było użyć w następnym etapie.
Ale jeśli możesz zrobić preserveNullAndEmptyArrays
, to faktycznie masz MongoDB 3.2 i dlatego lepiej jest użyć wyrażenia bez $unwind
w ogóle, ponieważ w ten sposób jest znacznie szybciej.