La mejor manera óptima de hacer esto es en MongoDB 3.2 o posterior. Necesitamos $project
nuestros documentos y use el $filter
operador para devolver un subconjunto de la matriz "topicInfo" que coincida con nuestra condición. Y a partir de MongoDB3.2, podemos usar $max
en el $project
etapa en el cond
ition expresión y realizar una operación lógica en el valor devuelto.
La etapa final en la canalización es $match
etapa en la que filtra esos documentos con "topicInfo" vacío usando el $exists
operador de consulta de elementos y la notación de puntos
para acceder al primer elemento de la matriz. Esto también reduce tanto la cantidad de datos enviados por cable como el tiempo y la memoria utilizados para decodificar documentos en el lado del 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 } } }
])