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

Múltiples operaciones de grupo utilizando el marco de agregación de Mongo

Es importante comprender que las operaciones en el argumento para agregar () forman una tubería . Esto significaba que la entrada a cualquier elemento de la canalización es el flujo de documentos producidos por el elemento anterior de la canalización.

En su ejemplo, su primera consulta crea una canalización de documentos que se ven así:

{
    "_id" : 2,
    "avg_score" : 5.5
},
{
    "_id" : 1,
    "avg_score" : 4
}

Esto significa que el segundo elemento de la tubería es ver una serie de documentos donde las únicas claves son "_id" y "avg_score". Las claves "category_id" y "score" ya no existen en este flujo de documentos.

Si desea agregar más en esta transmisión, deberá agregar usando las claves que se ven en esta etapa de la canalización. Dado que desea promediar los promedios, debe ingresar un solo valor constante para el campo _id, de modo que todos los documentos de entrada se agrupen en un solo resultado.

El siguiente código produce el resultado correcto:

db.questions.aggregate(
    { $group : {
        _id : "$category_id",
        avg_score : { $avg : "$score" },
        }
    },
    { $group : {
        _id : "all",
        avg_score : { $avg : "$avg_score" },
        }
    }
);

Cuando se ejecuta, produce el siguiente resultado:

 {
    "result" : [
        {
        "_id" : "all",
        "avg_score" : 4.75
        }
    ],
    "ok" : 1
 }