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

Recupera l'elenco degli elementi controllando più valori di attributo in MongoDB in golang

Dovresti utilizzare il framework di aggregazione in cui eseguire una pipeline di aggregazione che prima filtra i documenti nella raccolta in base a venueList ID utilizzando $match operatore.

La seconda pipeline comporterebbe l'appiattimento di venueList e sum matrici di documenti secondari in modo che i dati nei documenti vengano elaborati più in basso nella pipeline come voci denormalizzate. Il $unwind operatore è utile qui.

Un ulteriore filtro utilizzando $match è necessario dopo lo svolgimento in modo che solo i documenti che desideri aggregare siano ammessi nella pipeline successiva.

La pipeline principale sarebbe il $group fase operatore che aggrega i documenti filtrati per creare le somme desiderate utilizzando l'operatore accumulatore $sum . Per ottenere il risultato desiderato, dovresti utilizzare un operatore tenary come $cond per creare i campi di conteggio indipendenti poiché ciò alimenterà il numero di documenti a $sum espressione a seconda del valore del nome.

Mettendo tutto questo, considera l'esecuzione della seguente pipeline:

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    {
        "$group": {
            "_id": null,
            "linux": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "linux" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            },
            "ubuntu": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "ubuntu" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            }
        }
    }
])

Per l'utilizzo con mGo, puoi convertire la pipeline di cui sopra utilizzando la guida in http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Per un'alternativa più flessibile e con prestazioni migliori che venga eseguita molto più velocemente di quanto sopra e tenga anche in considerazione i valori sconosciuti per l'elenco di somma, eseguire la pipeline alternativa come segue

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    { 
        "$group": {
            "_id": "$venueList.sum.name",
            "count": { "$sum": "$venueList.sum.value" }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "name": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])