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