Anda memerlukan kerangka kerja agregasi untuk melakukan ini, saya pikir Anda benar-benar harus mengubah strukturnya, tetapi bekerja dengan apa yang Anda miliki:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
Di rilis mendatang, Anda hanya dapat menggunakan $slice
. yang baru operator:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Bahkan Anda dapat melakukan "keduanya" pada saat yang sama:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Dan itu jauh lebih baik daripada memproses dengan $unwind
dan $last
untuk mendapatkan elemen terakhir dari array ketika $group
diterapkan untuk mendapatkan data kembali.
Ini pada dasarnya memiliki kinerja yang sama dengan kueri biasa dalam bentuk yang lebih baru. Dalam bentuk sekarang, itu akan menjadi lebih lambat.