Най-добрият начин да направите това е в MongoDB 3.2 или по-нова. Трябва да $project
нашите документи и използвайте $filter
оператор за връщане на подмножество от масива "topicInfo", което отговаря на нашето условие. И от MongoDB3.2 можем да използваме $max
в $project
етап в cond
ition израз и извършване на логическа операция върху върнатата стойност.
Последният етап в процеса е $match
етап, където филтрирате тези документи с празен "topicInfo", като използвате $exists
елементен оператор на заявка и точкова нотация
за достъп до първия елемент в масива. Това също намалява както количеството данни, изпратени по кабела, така и времето и паметта, използвани за декодиране на документи от страна на клиента.
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 } } }
])