Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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 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"]
}
] )

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 _id a mayúsculas, con el operador $toUpper. Luego, el $project crea un nuevo campo, denominado 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 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_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 $sort ordena los resultados por el campo month_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' }
]

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

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

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

    • _idque 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 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 $unwind separa cada valor en el arreglo likes y 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 $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:

    • _idque 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 $limit solo 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 }
]

Volver

Ejemplo de código postal

En esta página