Cara terbaik yang optimal untuk melakukan ini adalah di MongoDB 3.2 atau yang lebih baru. Kita perlu $project
dokumen kami dan gunakan $filter
operator untuk mengembalikan subset dari larik "topicInfo" yang cocok dengan kondisi kita. Dan pada MongoDB3.2 , kita dapat menggunakan $max
di $project
tahap di cond
ekspresi ition dan melakukan operasi logika pada nilai yang dikembalikan.
Tahap terakhir dalam pipeline adalah $match
tahap di mana Anda memfilter dokumen tersebut dengan "topicInfo" kosong menggunakan $exists
operator kueri elemen dan notasi titik
untuk mengakses elemen pertama dalam array. Ini juga mengurangi jumlah data yang dikirim melalui kabel dan waktu serta memori yang digunakan untuk memecahkan kode dokumen di sisi klien.
db.collection.aggregate([
{ "$project": {
"topicInfo": {
"$filter": {
"input": "$topicInfo",
"as": "t",
"cond": {
"$and": [
{ "$eq": [ "$$t.topic", "topic2"] },
{ "$eq": [ "$$t.time", { "$max": "$topicInfo.time" } ] }
]
}
}
}
}},
{ "$match": { "topicInfo.0": { "$exists": true } } }
])