sql >> Database teknologi >  >> NoSQL >> MongoDB

få alle dokumenter med maksimal værdi ved hjælp af aggregering i mongodb

Hvis du vil beholde dokumentoplysninger, så skal du som udgangspunkt $push det i et array. Men selvfølgelig, så har du din $max værdier, skal du filtrere indholdet af arrayet for kun de elementer, der matcher:

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

Så du gemmer alt i et array og tester derefter hvert array-medlem for at se, om dets værdi matcher den, der blev registreret som maksimum, og kasserer alle, der ikke gør det.

Jeg ville beholde _id værdier i array-dokumenterne, da det er det, der gør dem "unikke" og ikke vil blive negativt påvirket af $setDifference ved filtrering af værdier. Men hvis "navn" altid er unikt, er det selvfølgelig ikke påkrævet.

Du kan også bare returnere de felter, du ønsker, fra $map , men jeg returnerer bare hele dokumentet for eksempel.

Husk, at dette har begrænsningen til ikke at overskride BSON-størrelsesgrænsen på 16 MB, så det er okay for små dataeksempler, men alt, der producerer en potentielt stor liste (da du ikke kan forfiltrere matrixindhold) ville være bedre at behandle med en separat forespørgsel for at finde "max" værdierne, og en anden for at hente de matchende dokumenter.



  1. NoSQL (MongoDB) vs Lucene (eller Solr) som din database

  2. Sådan sletter du nøgler, der matcher et mønster i Redis Cluster

  3. MongoDB tæller antallet af nye dokumenter pr. minut baseret på _id

  4. Henter underdokumenter af geoNear - MongoDB