MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como faço para contar várias chaves na mesma consulta de grupo $ de agregação do MongoDB?


Existem algumas abordagens diferentes que você pode usar aqui:

  1. 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.

  2. 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

  3. 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.