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