Optymalnym najlepszym sposobem na to jest MongoDB 3.2 lub nowszy. Musimy $project
nasze dokumenty i korzystaj z $filter
operatora, aby zwrócić podzbiór tablicy „topicInfo”, który pasuje do naszego warunku. A od MongoDB3.2 możemy użyć $max
w $project
etap w cond
wyrażenie i wykonać operację logiczną na zwróconej wartości.
Ostatnim etapem potoku jest $match
etap, na którym odfiltrowujesz te dokumenty z pustym „topicInfo” za pomocą $exists
operator zapytania o element i notacja z kropkami
aby uzyskać dostęp do pierwszego elementu w tablicy. Zmniejsza to również ilość danych przesyłanych przez sieć oraz czas i pamięć używaną do dekodowania dokumentów po stronie klienta.
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 } } }
])