Sebenarnya Anda cukup melakukan:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Sejak MongoDB 3.2 Anda sebenarnya dapat $project
dengan $sum
dan array argumen ( atau array ) dan oleh karena itu tidak perlu $unwind
sama sekali.
Cara "panjang", yang merupakan cara "lama" adalah dengan benar-benar menggunakan $unwind
, tetapi Anda kemudian akan benar-benar menambahkan $project
mengikuti $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" ] }
}}
])
Dan tentu saja Anda memerlukan $first
akumulator untuk mengembalikan "price"
bidang dari $group
tahap sehingga dapat digunakan pada tahap berikutnya.
Tetapi jika Anda dapat melakukan preserveNullAndEmptyArrays
, maka Anda sebenarnya memiliki MongoDB 3.2, dan oleh karena itu lebih baik menggunakan pernyataan tanpa $unwind
sama sekali, karena jauh lebih cepat melakukannya dengan cara itu.