Cách tốt nhất tối ưu để làm điều này là trong MongoDB 3.2 hoặc mới hơn. Chúng tôi cần $ project
tài liệu của chúng tôi và sử dụng $ bộ lọc
toán tử để trả về một tập hợp con của mảng "topicInfo" phù hợp với điều kiện của chúng ta. Và kể từ MongoDB3.2, chúng tôi có thể sử dụng $ max
trong $ project
giai đoạn trong cond
biểu thức ition và thực hiện một phép toán logic trên giá trị trả về.
Giai đoạn cuối cùng trong quy trình là $ match
giai đoạn mà bạn lọc ra những tài liệu có "topicInfo" trống bằng cách sử dụng mã <> $ tồn tại
toán tử truy vấn phần tử và ký hiệu dấu chấm
để truy cập phần tử đầu tiên trong mảng. Điều này cũng làm giảm cả lượng dữ liệu được gửi qua dây cũng như thời gian và bộ nhớ được sử dụng để giải mã tài liệu ở phía máy khách.
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 } } }
])