sql >> Base de Datos >  >> NoSQL >> MongoDB

Recupere la lista de elementos comprobando múltiples valores de atributos en MongoDB en golang

Necesitaría usar el marco de agregación donde ejecutaría una canalización de agregación que primero filtra los documentos en la colección según la venueList identificadores usando el $match operador.

La segunda canalización implicaría aplanar la venueList y sum matrices de subdocumentos para que los datos de los documentos se procesen más adelante en la canalización como entradas desnormalizadas. El $unwind El operador es útil aquí.

Otro filtro usando $match es necesario después de desenrollar para que solo los documentos que desea agregar se permitan en la siguiente canalización.

La canalización principal sería $group etapa de operador que agrega los documentos filtrados para crear las sumas deseadas utilizando el operador acumulador $sum . Para obtener el resultado deseado, necesitaría usar un operador tenario como $cond para crear los campos de conteo independientes, ya que eso alimentará la cantidad de documentos al $sum expresión dependiendo del valor del nombre.

Poniendo todo esto en conjunto, considere ejecutar la siguiente canalización:

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

Para usar con mGo, puede convertir la tubería anterior usando la guía en http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Para obtener una alternativa más flexible y de mejor rendimiento que se ejecute mucho más rápido que la anterior y que también tenga en cuenta los valores desconocidos para la lista de suma, ejecute la canalización alternativa de la siguiente manera

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