A melhor maneira de fazer isso é no MongoDB 3.2 ou mais recente. Precisamos
$project
nossos documentos e use o $filter
para retornar um subconjunto da matriz "topicInfo" que corresponda à nossa condição. E a partir do MongoDB3.2 , podemos usar o $max
no $project
estágio no cond
expressão de ção e execute uma operação lógica no valor retornado. O estágio final do pipeline é o
$match
estágio em que você filtra esses documentos com "topicInfo" vazio usando o $exists
operador de consulta de elemento e a notação de ponto
para acessar o primeiro elemento na matriz. Isso também reduz a quantidade de dados enviados pela rede e o tempo e a memória usados para decodificar documentos no lado do cliente. 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 } } }
])