modelo de datos
Considera una base de datos de un club deportivo con un members Colección que rastrea los nombres de los miembros, las fechas de inscripción y las preferencias deportivas:
db.members.insertMany( [ { _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] }, { _id: "joe", joined: ISODate("2012-07-02"), likes: ["tennis", "golf", "swimming"] }, { _id: "ruth", joined: ISODate("2012-01-14"), likes: ["golf", "racquetball"] }, { _id: "harold", joined: ISODate("2012-01-21"), likes: ["handball", "golf", "racquetball"] }, { _id: "kate", joined: ISODate("2012-01-14"), likes: ["swimming", "tennis"] } ] )
Devuelve un único campo
La siguiente operación utiliza $project para devolver solo el campo _id para todos los documentos de la colección members:
db.members.aggregate( [ { $project: { _id: 1 } } ] )
La operación devuelve los siguientes documentos:
[ { _id: 'jane' }, { _id: 'joe' }, { _id: 'ruth' }, { _id: 'harold' }, { _id: 'kate' } ]
Para operaciones básicas de query y proyección, las queries estándar con el método find() ofrecen el mejor rendimiento.
Normalizar y ordenar documentos
La siguiente operación devuelve los nombres de los nodos en mayúsculas y en orden alfabético. Podrías hacer esto para normalizar los nombres de los nodos para su procesamiento.
db.members.aggregate( [ { $project: { name: { $toUpper: "$_id" }, _id: 0 } }, { $sort: { name: 1 } } ] )
Todos los documentos de la colección members pasan por el pipeline, que consiste en las siguientes operaciones:
La operación devuelve el siguiente resultado:
[ { name: 'HAROLD' }, { name: 'JANE' }, { name: 'JOE' }, { name: 'KATE' }, { name: 'RUTH' } ]
Devolver nombres de usuario ordenados por mes de incorporación
La siguiente operación de agregación devuelve los nombres de los miembros ordenados por mes de ingreso. Puede usar esta agregación para generar avisos de renovación de membresía.
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" }, name: "$_id", _id: 0 } }, { $sort: { month_joined: 1 } } ] )
El pipeline pasa todos los documentos en la colección members a través de las siguientes operaciones:
El operador
$project:Crea dos campos nuevos:
month_joinedyname.Suprime el
idde los resultados. El métodoaggregate()incluye el_id, a menos que se suprima explícitamente.
El operador
$monthconvierte los valores del campojoineden representaciones enteras del mes. Luego, el operador$projectasigna estos valores al campomonth_joined.El operador ordena los resultados por
$sortelmonth_joinedcampo.
La operación devuelve el siguiente resultado:
[ { month_joined: 1, name: 'ruth' }, { month_joined: 1, name: 'harold' }, { month_joined: 1, name: 'kate' }, { month_joined: 3, name: 'jane' }, { month_joined: 7, name: 'joe' } ]
Devolver el número total de incorporaciones por mes
La siguiente operación muestra cuántas personas se unieron cada mes del año. Puede utilizar estos datos agregados para estrategias de reclutamiento y marketing.
db.members.aggregate( [ { $project: { month_joined: { $month: "$joined" } } } , { $group: { _id: { month_joined: "$month_joined" } , number: { $sum: 1 } } }, { $sort: { "_id.month_joined": 1 } } ] )
El pipeline pasa todos los documentos en la colección members a través de las siguientes operaciones:
El operador
$projectcrea un nuevo campo llamadomonth_joined.El operador convierte los valores
$monthdeljoinedcampo en representaciones enteras del mes. Luego, el operador asigna los valores$projectalmonth_joinedcampo.El operador
$grouprecopila todos los documentos con un valor determinado demonth_joinedy cuenta cuántos documentos hay para ese valor. Específicamente, para cada valor único,$groupcrea un nuevo documento "por mes" con dos campos:_id, que contiene un documento anidado con el campomonth_joinedy su valor.numberel cual es un campo generado. El operador$sumincrementa este campo en 1 por cada documento que contiene el valormonth_joineddado.
El operador
$sortordena los documentos creados por$groupsegún el contenido del campomonth_joined.
La operación de agregación devuelve los siguientes documentos:
[ { _id: { month_joined: 1 }, number: 3 }, { _id: { month_joined: 3 }, number: 1 }, { _id: { month_joined: 7 }, number: 1 } ]
Devuelve los cinco «me gusta» más comunes
La siguiente agregación recopila las cinco actividades más populares del conjunto de datos. Este tipo de análisis podría contribuir a la planificación y el desarrollo futuro.
db.members.aggregate( [ { $unwind: "$likes" }, { $group: { _id: "$likes" , number: { $sum: 1 } } }, { $sort: { number: -1 } }, { $limit: 5 } ] )
La pipeline comienza con todos los documentos en la colección members y pasa estos documentos a través de las siguientes operaciones:
El operador separa cada valor en
$unwindlalikesmatriz y crea una nueva versión del documento fuente para cada elemento de la matriz.Ejemplo
Dado el siguiente documento de la colección
members:{ _id: "jane", joined: ISODate("2011-03-02"), likes: ["golf", "racquetball"] } El operador
$unwindgenera los siguientes documentos:{ _id: "jane", joined: ISODate("2011-03-02"), likes: "golf" } { _id: "jane", joined: ISODate("2011-03-02"), likes: "racquetball" } El operador
$grouprecopila todos los documentos con el mismo valor para el campolikesy cuenta cada agrupamiento. Con esta información,$groupcrea un nuevo documento con dos campos:_id, que contiene el valorlikes.numberel cual es un campo generado. El operador$sumincrementa este campo en 1 por cada documento que contiene el valorlikesdado.
El operador
$sortordena estos documentos por el camponumberen orden inverso.El operador solo incluye los primeros 5 documentos de
$limitresultados.
La operación de agregación devuelve los siguientes documentos:
[ { _id: 'golf', number: 4 }, { _id: 'racquetball', number: 3 }, { _id: 'tennis', number: 2 }, { _id: 'swimming', number: 2 }, { _id: 'handball', number: 1 } ]