Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Pipeline de agregación
/ / /

Agregación con datos de preferencias de usuario

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

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.

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:

  • El operador $project:

    • 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 $sort ordena los resultados por el campo name.

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

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_joined y name.

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

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

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

El pipeline pasa todos los documentos en la colección members a través de las siguientes operaciones:

  • El operador $project crea un nuevo campo llamado month_joined.

  • 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.

    • numberel cual es un campo generado. El operador $sum incrementa este campo en 1 por cada documento que contiene el valor month_joined dado.

  • El operador $sort ordena los documentos creados por $group según el contenido del campo month_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 }
]

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 $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 $unwind genera los siguientes documentos:

    {
    _id: "jane",
    joined: ISODate("2011-03-02"),
    likes: "golf"
    }
    {
    _id: "jane",
    joined: ISODate("2011-03-02"),
    likes: "racquetball"
    }
  • El operador $group recopila todos los documentos con el mismo valor para el campo likes y cuenta cada agrupamiento. Con esta información, $group crea un nuevo documento con dos campos:

    • _id, que contiene el valor likes.

    • numberel cual es un campo generado. El operador $sum incrementa este campo en 1 por cada documento que contiene el valor likes dado.

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

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

Volver

Ejemplo de código postal

En esta página