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 llamadasum 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.
Compártelo: