En realidad, simplemente puedes hacer:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Desde MongoDB 3.2, en realidad puede $project
con $sum
y una matriz de argumentos (o una matriz) y, por lo tanto, no es necesario $unwind
en absoluto.
La forma "larga", que es la forma "antigua", es usar $unwind
, pero luego agregaría un $project
siguiendo el $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" ] }
}}
])
Y, por supuesto, necesita el $first
acumulador para devolver el "price"
campo del $group
etapa para que pueda usarse en la etapa siguiente.
Pero si puedes hacer preserveNullAndEmptyArrays
, entonces en realidad tiene MongoDB 3.2 y, por lo tanto, es mejor usar la instrucción sin el $unwind
en absoluto, ya que es mucho más rápido hacerlo de esa manera.