Eigentlich können Sie einfach Folgendes tun:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Seit MongoDB 3.2 können Sie tatsächlich $project
mit $sum
und ein Array von Argumenten ( oder ein Array ) und müssen daher nicht $unwind
werden überhaupt.
Der "lange" Weg, der der "alte" Weg ist, ist die tatsächliche Verwendung von $unwind
, aber Sie würden dann tatsächlich ein $project
nach $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" ] }
}}
])
Und natürlich benötigen Sie dann den $first
Akkumulator, um den "Preis"
zurückzugeben Feld aus $group
Phase, damit es in der folgenden Phase verwendet werden kann.
Aber wenn Sie preserveNullAndEmptyArrays
tun können , dann haben Sie tatsächlich MongoDB 3.2 und verwenden daher besser die Anweisung ohne der $unwind
überhaupt nicht, da es so viel schneller geht.