Na verdade, você pode simplesmente fazer:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Desde o MongoDB 3.2, você pode
$project
com $sum
e uma matriz de argumentos ( ou uma matriz ) e, portanto, não precisa $unwind
de forma alguma. O caminho "longo", que é o caminho "antigo", é usar
$unwind
, mas você adicionaria um $project
seguindo o $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 é claro que você precisa do
$first
acumulador para retornar o "price"
campo do $group
estágio para que possa ser usado no estágio seguinte. Mas se você puder fazer
preserveNullAndEmptyArrays
, então você realmente tem o MongoDB 3.2 e, portanto, é melhor usar a instrução sem o $unwind
em tudo, já que é muito mais rápido fazê-lo dessa maneira.