Er zijn een paar verschillende benaderingen die u hier kunt gebruiken:
-
Gebruik kaart/verklein:doe dit niet. Op dit moment zou het veel sneller zijn om het aggregatieraamwerk drie keer uit te voeren dan om een kaartverkleiningsfunctie te gebruiken voor dit gebruik.
-
Voer de aggregatie 3 keer uit. Dit is niet optimaal, maar als je geen tijdsdruk hebt, is dit de gemakkelijkste optie. Als uw aggregaties toch
-
Dit is de beste work-around die ik kan bedenken. De
$group
operator stelt u in staat om een _id
. te bouwen op meerdere velden. bijv.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Als u dit doet, ontstaat er een groepering voor alle bestaande combinaties van uw verschillende sleutels. U kunt uw sleutels mogelijk op deze manier groeperen en vervolgens handmatig de resultaten in de client optellen.
Laat me toelichten. Laten we zeggen dat we een verzameling vormen hebben. Deze vormen kunnen een kleur, een grootte en een soort hebben (vierkant, cirkel, enz.). Een aggregatie op een ID met meerdere sleutels kan er als volgt uitzien:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
en keer terug:
"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
}
... enzovoort
U zou dan de resultaten aan de klantzijde samenvatten, over een drastisch verminderd aantal vermeldingen. Ervan uitgaande dat het aantal unieke waarden voor elke sleutel voldoende klein is in vergelijking met het totale aantal documenten, zou u deze laatste stap in een verwaarloosbare hoeveelheid tijd kunnen doen.