modelo de datos
Considera una base de datos de un club deportivo con un members colección que realiza un seguimiento de los nombres de los nodos, las fechas de ingreso 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 nodos ordenados por el mes en que se unieron. Podrías usar esta agregación para ayudar a 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
$sortordena los resultados por el campomonth_joined.
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. Podría usar 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
$monthconvierte los valores del campojoineden representaciones enteras del mes. A continuación, el operador$projectasigna los valores al campomonth_joined.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:_idque 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 recolecta las cinco actividades más “más gustadas” en el conjunto de datos. Este tipo de análisis podría ayudar a informar 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
$unwindsepara cada valor en el arreglolikesy crea una nueva versión del documento fuente para cada elemento en el arreglo.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:_idque 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
$limitsolo incluye los 5 primeros documentos de resultados.
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 } ]