lunes, 16 de diciembre de 2013

Cómo ordenar documentos por la suma de varios campos en MongoDB

Hoy me he visto con la necesidad de realizar una consulta en MongoDB, la cual necesitaba ordenar por la suma de una serie de campos de un documento y os voy a explicar como la he realizado usando Aggregation.

El ejemplo consiste en una colección de documentos de cursos en el cual se recogen las calificaciones de asignaturas y debemos mostrar los documentos ordenados por la suma de todas las calificaciones por documento.

La estructura del documento es la siguiente:
{
    nombre    : "Daniel Romero",
    Curso : "Probando MongoDB por HispaBigdata",
    NotaAsignatura1  : 5.5,
    NotaAsignatura2  : 6.4,
    NotaAsignatura3  : 7.8
}
Aquí tenéis una serie de documentos con los que podéis hacer pruebas.

db.perfiles.insert({
    nombre    : "Daniel Romero",
    Curso : "Probando MongoDB por HispaBigdata",
    NotaAsignatura1  : 5.5,
    NotaAsignatura2  : 6.4,
    NotaAsignatura3  : 7.8
});
db.perfiles.insert({
    nombre    : "Alberto Hernandez",
    Curso : "Probando CouchDB por HispaBigdata",
    NotaAsignatura1  : 8.5,
    NotaAsignatura2  : 5.3,
    NotaAsignatura3  : 6.7
});
db.perfiles.insert({
    nombre    : "Natalia Miro",
    Curso : "Probando MongoDB por HispaBigdata",
    NotaAsignatura1  : 8.4,
    NotaAsignatura2  : 3.5,
    NotaAsignatura3  : 6.25
});
db.perfiles.insert({
    nombre    : "Manuel Rodriguez",
    Curso : "Probando CouchDB por HispaBigdata",
    NotaAsignatura1  : 5.4,
    NotaAsignatura2  : 6.4,
    NotaAsignatura3  : 8.2
});

Y ahora realizamos el aggregatión:
db.perfiles.aggregate(
{$project: {nombre : "$nombre", 
            curso : "$curso", 
            NotaAsignatura1 : "$NotaAsignatura1", 
            NotaAsignatura2 : "$NotaAsignatura2", 
            NotaAsignatura3 : "$NotaAsignatura3",
            sum : {$add : ["$NotaAsignatura1", "$NotaAsignatura2", "$NotaAsignatura1"]}}},
{$sort: {sum: -1}}
)
Como podeis observar vamos a proyectar todos los campos del documento y vamos a crear una variable llamada sum que contendrá la suma de todas las calificaciones, posteriormente vamos a ordenador de forma descendente por el valor de dicha variable.

Es un ejemplo sencillo el cual nos puede ser útil a la hora de trabajar con calificaciones.

No hay comentarios:

Publicar un comentario