Zde můžete použít několik různých přístupů:
-
Použít mapu/zmenšit:nedělejte to. Právě teď by bylo mnohem rychlejší spustit agregační rámec 3x než použít funkci map reduction pro tento případ použití.
-
Spusťte agregaci 3krát. To není optimální, ale pokud nemáte časová omezení, pak je to nejjednodušší možnost. Pokud vaše agregace stejně zaberou
-
Tady je nejlepší řešení, které mě napadá.
$group
operátor vám umožňuje vytvořit_id
na více polích. Např.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Tím vytvoříte seskupení pro všechny existující kombinace vašich různých klíčů. Tímto způsobem můžete potenciálně seskupit klíče a poté ručně sčítat výsledky v klientovi.
Dovolte mi to upřesnit. Řekněme, že máme sbírku tvarů. Tyto tvary mohou mít barvu, velikost a druh (čtverec, kruh atd.). Agregace na víceklíčovém ID může vypadat takto:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
a vrátit se:
"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
}
... a tak dále
Poté byste sečetli výsledky na straně klienta přes drasticky snížený počet záznamů. Za předpokladu, že počet jedinečných hodnot pro každý klíč je dostatečně malý ve srovnání s celkovým počtem dokumentů, můžete tento poslední krok provést za zanedbatelné množství času.