Docs Menu
Docs Home
/ /
Pipeline de agregación
/ / /

Agregación con datos de preferencias del usuario

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"]
}
] )

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.

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:

  • El $project operador:

    • crea un nuevo campo llamado name.

    • Convierte el valor de a _id mayúsculas mediante el $toUpper operador. Luego, crea un nuevo campo,$project llamado,name para almacenar este valor.

    • suprime el campo id. $project pasará por defecto el campo _id, a menos que se suprima explícitamente.

  • El operador ordena los resultados por $sort el name campo.

La operación devuelve el siguiente resultado:

[
{ name: 'HAROLD' },
{ name: 'JANE' },
{ name: 'JOE' },
{ name: 'KATE' },
{ name: 'RUTH' }
]

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 $project operador:

    • Crea dos nuevos campos: month_joined y name.

    • Suprime el id de los resultados. El método incluye aggregate() el,_id a menos que se suprima explícitamente.

  • El operador convierte los valores $month del joined campo en representaciones enteras del mes. Luego, el operador asigna esos valores $project al month_joined campo.

  • El operador ordena los resultados por $sort el month_joined campo.

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' }
]

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 $project campo month_joined llamado.

  • El operador convierte los valores $month del joined campo en representaciones enteras del mes. Luego, el operador asigna los valores $project al month_joined campo.

  • El operador $group recopila todos los documentos con un valor determinado de month_joined y cuenta cuántos documentos hay para ese valor. Específicamente, para cada valor único, $group crea un nuevo documento "por mes" con dos campos:

    • _id, que contiene un documento anidado con el campo month_joined y su valor.

    • number, que es un campo generado. El operador incrementa este campo $sum en 1 por cada documento que contenga el month_joined valor indicado.

  • El operador ordena $sort $group los month_joined documentos 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 }
]

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 $unwind la likes matriz 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 $unwind documentos:

    {
    _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 $group el likes campo y contabiliza cada grupo. Con esta información, crea un nuevo documento con dos$group campos:

    • _id, que contiene el valor likes.

    • number, que es un campo generado. El operador incrementa este campo $sum en 1 por cada documento que contenga el likes valor indicado.

  • El operador ordena estos documentos por $sort el number campo en orden inverso.

  • El operador solo incluye los $limit primeros 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 }
]

Volver

Ejemplo de código postal

En esta página