Existem algumas abordagens diferentes que você pode usar aqui:
-
Use map/reduce:não faça isso. No momento, seria muito mais rápido executar a estrutura de agregação 3 vezes do que usar uma função de redução de mapa para este caso de uso.
-
Execute a agregação 3 vezes. Isso não é o ideal, mas se você não tiver restrições de tempo, essa é a opção mais fácil. Se suas agregações estão levando -
Aqui está a melhor solução que posso pensar. O$group
operador permite que você crie um_id
em vários campos. Por exemplo.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Isso cria um agrupamento para todas as combinações existentes de suas diferentes teclas. Você poderia agrupar suas chaves dessa maneira e, em seguida, somar manualmente os resultados no cliente.
Deixe-me elaborar. Digamos que temos uma coleção de formas. Essas formas podem ter uma cor, um tamanho e um tipo (quadrado, círculo, etc). Uma agregação em um ID de várias chaves pode ter a seguinte aparência:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
e retorno:
"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 assim por diante
Você então resumiria os resultados do lado do cliente, em um número drasticamente reduzido de entradas. Supondo que o número de valores exclusivos para cada chave seja suficientemente pequeno em comparação com o número total de documentos, você pode realizar essa etapa final em um período de tempo insignificante.