Всъщност можете просто да направите:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
От MongoDB 3.2 всъщност можете да $project
с $sum
и масив от аргументи (или масив) и следователно не е необходимо $unwind
изобщо.
„Дългият“ начин, който е „старият“ начин, е всъщност да използвате $unwind
, но тогава всъщност ще добавите $project
след $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" ] }
}}
])
И разбира се след това се нуждаете от $first
акумулатор, за да върне "price"
поле от $group
етап, за да може да се използва в следващия етап.
Но ако можете да направите preserveNullAndEmptyArrays
, тогава всъщност имате MongoDB 3.2 и затова е по-добре да използвате оператора без $unwind
изобщо, тъй като е много по-бързо да го направите по този начин.