MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Recupere a lista de itens verificando vários valores de atributo no MongoDB em golang


Você precisaria usar a estrutura de agregação onde executaria um pipeline de agregação que primeiro filtra os documentos na coleção com base na venueList ids usando o $match operador.

O segundo pipeline envolveria o achatamento da venueList e soma matrizes de subdocumentos para que os dados nos documentos sejam processados ​​mais adiante no pipeline como entradas desnormalizadas. O $unwind operador é útil aqui.

Outro filtro usando $match é necessário após o desenrolamento para que apenas os documentos que você deseja agregar sejam permitidos no próximo pipeline.

O pipeline principal seria o $grupo estágio do operador que agrega os documentos filtrados para criar as somas desejadas usando o operador acumulador $sum . Para o resultado desejado, você precisaria usar um operador tenário como $cond para criar os campos de contagem independentes, pois isso alimentará o número de documentos para o $sum expressão dependendo do valor do nome.

Colocando isso em conjunto, considere executar o seguinte 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 
                    ]
                }
            }
        }
    }
])

Para uso com mGo, você pode converter o pipeline acima usando as orientações em http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Para uma alternativa mais flexível e com melhor desempenho que executa muito mais rápido que a acima e também leva em consideração valores desconhecidos para a lista de soma, execute o pipeline alternativo da seguinte maneira
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"
                }
            }
        }
    }
])