Det finns några olika tillvägagångssätt du kan använda här:
-
Använd kartlägga/förminska:gör inte detta. Just nu skulle det vara mycket snabbare att köra aggregeringsramverket 3 gånger än att använda en kartreduceringsfunktion för detta användningsfall.
-
Kör aggregering 3 gånger. Detta är inte optimalt, men om du inte har tidsbrist så är detta det enklaste alternativet. Om dina sammanställningar tar
-
Här är den bästa lösningen jag kan tänka mig.
$group
operatorn låter dig bygga ett_id
på flera fält. T.ex.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Genom att göra detta skapas en gruppering för alla befintliga kombinationer av dina olika nycklar. Du kan potentiellt gruppera dina nycklar på detta sätt och sedan manuellt summera resultaten i klienten.
Låt mig utveckla. Låt oss säga att vi har en samling former. Dessa former kan ha en färg, en storlek och en typ (fyrkant, cirkel, etc). En aggregering på ett multinyckel-ID kan se ut så här:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
och returnera:
"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
}
... och så vidare
Du skulle sedan summera resultaten på klientsidan, över ett drastiskt minskat antal poster. Om du antar att antalet unika värden för varje nyckel är tillräckligt litet jämfört med det totala antalet dokument, kan du göra detta sista steg på en försumbar tid.