sql >> Databáze >  >> NoSQL >> MongoDB

získejte všechny dokumenty s maximální hodnotou pomocí agregace v mongodb

Pokud si chcete uchovat informace o dokumentu, pak v podstatě potřebujete $push to do pole. Ale samozřejmě, pak mít svůj $max hodnoty, musíte filtrovat obsah pole pouze pro prvky, které se shodují:

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

Takže vše uložíte do pole a poté otestujete každý člen pole, abyste zjistili, zda se jeho hodnota shoduje s hodnotou, která byla zaznamenána jako maximální, a vyřadíte všechny, které tomu tak nejsou.

Ponechal bych _id hodnoty v dokumentech pole, protože to je dělá "jedinečnými" a nebudou nepříznivě ovlivněny $setDifference při filtrování hodnot. Ale samozřejmě, pokud je "jméno" vždy jedinečné, pak to nebude vyžadováno.

Můžete také vrátit jakákoli pole, která chcete, z $map , ale například vracím celý dokument.

Mějte na paměti, že to má omezení spočívající v nepřekročení limitu velikosti BSON 16 MB, takže je v pořádku pro malé vzorky dat, ale cokoli vytvářející potenciálně velký seznam (protože nemůžete předfiltrovat obsah pole) by bylo lepší zpracovat pomocí samostatný dotaz pro nalezení hodnot "max" a další pro načtení odpovídajících dokumentů.



  1. Přístup k databázi produkce Meteor

  2. Jak omezit maximální referenci nadřazeného uzlu v mongodb

  3. MongoDB Multiple Masters v ReplicaSet

  4. Odebrání objektu s ObjectId z pole v Mongoose/MongoDB