sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo cuento varias claves en la misma consulta de grupo $ de agregación de MongoDB?

Hay algunos enfoques diferentes que podría usar aquí:

  1. Use map/reduce:no haga esto. En este momento, sería mucho más rápido ejecutar el marco de agregación 3 veces que usar una función de reducción de mapa para este caso de uso.

  2. Ejecute la agregación 3 veces. Esto no es óptimo, pero si no tiene limitaciones de tiempo, esta es la opción más fácil. Si sus agregaciones tardan

  3. Esta es la mejor solución que se me ocurre. El $group operador le permite construir un _id en múltiples campos. P.ej. {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}} . Al hacer esto, se crea una agrupación para todas las combinaciones existentes de sus diferentes claves. Potencialmente, podría agrupar sus claves de esta manera y luego sumar manualmente los resultados en el cliente.

Déjame elaborar. Digamos que tenemos una colección de formas. Estas formas pueden tener un color, un tamaño y un tipo (cuadrado, círculo, etc.). Una agregación en un ID de clave múltiple podría verse así:

db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})

y regresa:

"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
        }

... y así sucesivamente

Luego, resumiría los resultados del lado del cliente, en un número drásticamente reducido de entradas. Suponiendo que la cantidad de valores únicos para cada clave es lo suficientemente pequeña en comparación con la cantidad total de documentos, podría realizar este paso final en una cantidad de tiempo insignificante.