Istnieje kilka różnych podejść, których możesz tutaj użyć:
-
Użyj mapy/redukuj:nie rób tego. W tej chwili znacznie szybciej byłoby uruchomić strukturę agregacji 3 razy niż użyć funkcji zmniejszania mapy w tym przypadku użycia.
-
Uruchom agregację 3 razy. Nie jest to optymalne rozwiązanie, ale jeśli nie masz ograniczeń czasowych, to jest to najłatwiejsza opcja. Jeśli Twoje agregacje i tak zajmują
-
Oto najlepsze rozwiązanie, jakie przychodzi mi do głowy.
$group
operator pozwala zbudować_id
na wielu polach. Np.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Spowoduje to utworzenie grupowania dla wszystkich istniejących kombinacji różnych klawiszy. Możesz potencjalnie pogrupować klucze w ten sposób, a następnie ręcznie zsumować wyniki w kliencie.
Pozwól, że rozwinę. Załóżmy, że mamy kolekcję kształtów. Te kształty mogą mieć kolor, rozmiar i rodzaj (kwadrat, koło itp.). Agregacja na podstawie identyfikatora z wieloma kluczami może wyglądać tak:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
i zwrot:
"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
}
... i tak dalej
Następnie zsumowałbyś wyniki po stronie klienta, przy drastycznie zmniejszonej liczbie wpisów. Zakładając, że liczba unikalnych wartości dla każdego klucza jest wystarczająco mała w porównaniu z całkowitą liczbą dokumentów, możesz wykonać ten ostatni krok w znikomym czasie.