MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Récupérer les sous-documents qui correspondent à la valeur maximale dans le tableau

La meilleure façon optimale de le faire est dans MongoDB 3.2 ou plus récent. Nous devons $project nos documents et utilisez le $filter pour renvoyer un sous-ensemble du tableau "topicInfo" qui correspond à notre condition. Et à partir de MongoDB3.2 , nous pouvons utiliser le $max dans le $project étape dans le cond ition expression et effectuer une opération logique sur la valeur renvoyée.

La dernière étape du pipeline est le $match étape où vous filtrez ces documents avec "topicInfo" vide en utilisant le $exists opérateur de requête d'élément et la notation par points pour accéder au premier élément du tableau. Cela réduit également à la fois la quantité de données envoyées sur le réseau et le temps et la mémoire utilisés pour décoder les documents côté client.

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