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

ottieni tutti i documenti con valore massimo usando l'aggregazione in mongodb

Se desideri conservare le informazioni sui documenti, devi sostanzialmente $push in una matrice. Ma ovviamente, poi avere il tuo $max valori, è necessario filtrare il contenuto dell'array solo per gli elementi che corrispondono:

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

Quindi memorizzi tutto in un array e quindi verifichi ogni membro dell'array per vedere se il suo valore corrisponde a quello che è stato registrato come massimo, scartando quelli che non lo fanno.

Conserverei il _id valori nei documenti dell'array poiché questo è ciò che li rende "unici" e non saranno influenzati negativamente da $setDifference quando si filtrano i valori. Ma ovviamente se "nome" è sempre univoco, non sarà richiesto.

Puoi anche restituire qualsiasi campo desideri da $map , ma ad esempio sto solo restituendo l'intero documento.

Tieni presente che questo ha il limite di non superare il limite di dimensione BSON di 16 MB, quindi va bene per piccoli campioni di dati, ma qualsiasi cosa che produca un elenco potenzialmente grande (poiché non puoi pre-filtrare il contenuto dell'array) sarebbe meglio da elaborare con un query separata per trovare i valori "max" e un'altra per recuperare i documenti corrispondenti.