sql >> Base de Datos >  >> NoSQL >> MongoDB

Recuperar subdocumentos que coincidan con el valor máximo en la matriz

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 } } }
])