Optimální nejlepší způsob, jak toho dosáhnout, je v MongoDB 3.2 nebo novějším. Potřebujeme $project
naše dokumenty a použijte $filter
operátor vrátí podmnožinu pole "topicInfo", která odpovídá naší podmínce. A od MongoDB3.2 můžeme použít $max
v $project
fázi v cond
ition a provést logickou operaci s vrácenou hodnotou.
Poslední fází v procesu je $match
fázi, kdy odfiltrujete tyto dokumenty s prázdným „topicInfo“ pomocí $exists
operátor dotazu na prvek a tečkový zápis
pro přístup k prvnímu prvku v poli. To také snižuje jak množství dat odesílaných po drátě, tak čas a paměť použitou k dekódování dokumentů na straně 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 } } }
])