Ci sono diversi approcci che potresti usare qui:
-
Usa mappa/riduci:non farlo. In questo momento sarebbe molto più veloce eseguire il framework di aggregazione 3 volte piuttosto che utilizzare una funzione di riduzione della mappa per questo caso d'uso.
-
Esegui l'aggregazione 3 volte. Questo non è ottimale, ma se non hai vincoli di tempo, questa è l'opzione più semplice. Se le tue aggregazioni impiegano
-
Ecco la migliore soluzione che mi viene in mente. Il
$group
operatore ti consente di creare un_id
su più campi. Per esempio.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. In questo modo si crea un raggruppamento per tutte le combinazioni esistenti delle diverse chiavi. Potresti potenzialmente raggruppare le tue chiavi in questo modo e quindi sommare manualmente i risultati nel client.
Lasciami elaborare. Diciamo che abbiamo una collezione di forme. Queste forme possono avere un colore, una dimensione e un tipo (quadrato, cerchio, ecc.). Un'aggregazione su un ID multi-chiave potrebbe essere simile a:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
e ritorno:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... e così via
Quindi riassumeresti i risultati lato client, su un numero di voci drasticamente ridotto. Supponendo che il numero di valori univoci per ciascuna chiave sia sufficientemente piccolo rispetto al numero totale di documenti, potresti eseguire questo passaggio finale in un lasso di tempo trascurabile.