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

obtenir tous les documents ayant une valeur maximale en utilisant l'agrégation dans mongodb

Si vous souhaitez conserver les informations du document, vous devez essentiellement $push dans un tableau. Mais bien sûr, avoir alors votre $max valeurs, vous devez filtrer le contenu du tableau uniquement pour les éléments qui correspondent :

db.coll.aggregate([
    { "$group":{ 
        "_id": "$country",
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "name": "$name",
            "quantity": "$quantity"
        }}
    }},
    { "$project": {
        "maxQuantity": 1,
        "docs": {
            "$setDifference": [
               { "$map": {
                   "input": "$docs",
                   "as": "doc",
                   "in": {
                       "$cond": [ 
                           { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                           "$$doc",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
])

Donc, vous stockez tout dans un tableau, puis testez chaque membre du tableau pour voir si sa valeur correspond à celle qui a été enregistrée comme maximum, en supprimant ceux qui ne le font pas.

Je garderais le _id valeurs dans les documents du tableau puisque c'est ce qui les rend "uniques" et ne sera pas affecté par $setDifference lors du filtrage des valeurs. Mais bien sûr, si "nom" est toujours unique, il ne sera pas obligatoire.

Vous pouvez également simplement renvoyer les champs de votre choix à partir de $map , mais je ne fais que renvoyer le document entier par exemple.

Gardez à l'esprit que cela a la limitation de ne pas dépasser la limite de taille BSON de 16 Mo, donc c'est correct pour les petits échantillons de données, mais tout ce qui produit une liste potentiellement grande (puisque vous ne pouvez pas pré-filtrer le contenu du tableau) serait mieux traité avec un une requête séparée pour trouver les valeurs "max" et une autre pour récupérer les documents correspondants.