MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Recuperar subdocumentos que correspondam ao valor máximo na matriz


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