Trên thực tế, bạn chỉ có thể làm:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
Kể từ MongoDB 3.2, bạn thực sự có thể $project
với $sum
và một mảng đối số (hoặc một mảng) và do đó không cần $unwind
ở tất cả.
Cách "dài", là cách "cũ" là thực sự sử dụng $unwind
, nhưng sau đó bạn sẽ thực sự thêm một $project
theo dõi $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" ] }
}}
])
Và tất nhiên sau đó bạn cần $first
tích lũy để trả lại "price"
từ trường $group
để nó có thể được sử dụng trong giai đoạn sau.
Nhưng nếu bạn có thể thực hiện preserveNullAndEmptyArrays
, thì bạn thực sự có MongoDB 3.2 và do đó tốt hơn nên sử dụng câu lệnh without the $unwind
chút nào, vì làm theo cách đó nhanh hơn nhiều.