Bạn cần khung tổng hợp để làm điều này, tôi nghĩ bạn thực sự nên thay đổi cấu trúc, nhưng làm việc với những gì bạn có:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
Trong các bản phát hành trong tương lai, bạn sẽ có thể chỉ sử dụng $slice
mới nhà điều hành:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Trên thực tế, bạn có thể thực hiện "cả hai" trường cùng một lúc:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Và điều đó tốt hơn rất nhiều so với xử lý bằng $unwind
và $last
để lấy phần tử cuối cùng của mảng khi $group
được áp dụng để lấy lại dữ liệu.
Về cơ bản, nó có hiệu suất giống như một truy vấn thông thường ở dạng mới hơn. Ở dạng hiện tại, nó sẽ chậm hơn.