Modelo de datos
Considere una base de datos de un club deportivo con una 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"] } ] )
Devolver un solo campo
La siguiente operación utiliza $project para devolver solo el _id campo para todos los documentos de la members colección:
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 consulta y proyección, las consultas estándar con el método tienen el mejor find() rendimiento.
Normalizar y ordenar documentos
La siguiente operación devuelve los nombres de los miembros en mayúsculas y en orden alfabético. Puede realizar esta operación para normalizar los nombres de los miembros durante el procesamiento.
db.members.aggregate( [ { $project: { name: { $toUpper: "$_id" }, _id: 0 } }, { $sort: { name: 1 } } ] )
Todos los documentos de la colección members pasan por la canalización, que consta de 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 ingreso
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 } } ] )
La tubería pasa todos los documentos de la colección members a través de las siguientes operaciones:
El
$projectoperador:Crea dos nuevos campos:
month_joinedyname.Suprime el
idde los resultados. El método incluyeaggregate()el,_ida menos que se suprima explícitamente.
El operador convierte los valores
$monthdeljoinedcampo en representaciones enteras del mes. Luego, el operador asigna esos valores$projectalmonth_joinedcampo.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 uniones 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 } } ] )
La tubería pasa todos los documentos de la colección members a través de las siguientes operaciones:
El operador crea un nuevo
$projectcampomonth_joinedllamado.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.number, que es un campo generado. El operador incrementa este campo$sumen 1 por cada documento que contenga elmonth_joinedvalor indicado.
El operador ordena
$sort$grouplosmonth_joineddocumentos creados por según el contenido del campo.
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 canalización comienza con todos los documentos de 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 genera los siguientes
$unwinddocumentos:{ _id: "jane", joined: ISODate("2011-03-02"), likes: "golf" } { _id: "jane", joined: ISODate("2011-03-02"), likes: "racquetball" } El operador recopila todos los documentos con el mismo valor en
$groupellikescampo y contabiliza cada grupo. Con esta información, crea un nuevo documento con dos$groupcampos:_id, que contiene el valorlikes.number, que es un campo generado. El operador incrementa este campo$sumen 1 por cada documento que contenga ellikesvalor indicado.
El operador ordena estos documentos por
$sortelnumbercampo en orden inverso.El operador solo incluye los
$limitprimeros 5 documentos de resultado.
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 } ]