Docs Menu
Docs Home
/ /

db.collection.aggregate() (método mongosh)

MongoDB con controladores

Esta página documenta una mongosh . Para ver el método equivalente en un driver de MongoDB, se debe consultar la página correspondiente al lenguaje de programación:

C#Java SyncNode.jsPyMongoCC++GoJava RSKotlin CoroutineKotlin SyncPHPMotorMongoidRustScala
db.collection.aggregate(pipeline, options)

Calcula valores agregados para los datos de una colección o un vista.

Devuelve:
  • Un cursor para los documentos producidos por la etapa final de la pipeline de agregación.
  • Si la pipeline incluye la opción explain, la query devuelve un documento que proporciona detalles sobre el procesamiento de la operación de agregación.
  • Si la pipeline incluye los operadores $out o $merge, la query devuelve un cursor vacío.

Puedes usar db.collection.aggregate() para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

El método aggregate() tiene la siguiente forma:

db.collection.aggregate( <pipeline>, <options> )

El método aggregate() toma los siguientes parámetros:

Parameter
Tipo
Descripción

pipeline

arreglo

Una secuencia de operaciones o etapas de agregación de datos. Véase la

operadores de tuberías de agregación para obtener más detalles.

El método aún puede aceptar las etapas de la pipeline como argumentos separados en lugar de como elementos de un arreglo; sin embargo, si no especifica pipeline como un arreglo, no podrá especificar el parámetro options.

options

Documento

Opcional. Opciones adicionales que aggregate() pasa
al comando. Disponible solo si se aggregate especifica pipeline como una matriz.

El documento options puede contener los siguientes campos y valores:

Modificado en la versión 5.0.

Campo
Tipo
Descripción

explain

booleano

Opcional. Especifica que se devuelva información sobre el procesamiento de la canalización. Consulte "Devolver información sobre la operación de canalización de agregación" para ver un ejemplo.

No disponible en transacciones multi-documento.

allowDiskUse

booleano

Opcional. Permite escribir en archivos temporales. Cuando se establece true en, las operaciones de agregación pueden escribir datos en el _tmp subdirectorio del directorio. Consulte la dbPath interacción con allowDiskUseByDefault para ver un ejemplo.

Los mensajes de registro del perfilador y los mensajes de registro de diagnóstico incluyen un indicador usedDisk si alguna etapa de agregación escribió datos en archivos temporales debido a restricciones de memoria.

cursor

Documento

Opcional. Especifica el tamaño del lote inicial del cursor. El valor del cursor campo corresponde a un documento con el campo. Consulte "Especificar un tamaño de lote inicial"batchSize para ver la sintaxis y un ejemplo.

maxTimeMS

non-negative integer

Opcional. Especifica un límite de tiempo en milisegundos para procesar operaciones en un cursor. El valor predeterminado es 60000 milisegundos o 60 segundos. Si se establece explícitamente el valor en 0, las operaciones no agotarán el tiempo de espera.

MongoDB finaliza las operaciones que exceden su límite de tiempo asignado utilizando el mismo mecanismo que db.killOp(). MongoDB solo termina una operación en uno de sus puntos de interrupción designados.

bypassDocumentValidation

booleano

Opcional. Aplicable solo si se especifican las etapas de agregación $out o $merge.

Permite que omita la validación de documentos durante la operación. Esto permite insertar documentos que no cumplen los requisitos de db.collection.aggregate() validación.

readConcern

Documento

Opcional. Especifica el nivel de consistencia de lectura.

La opción readConcern tiene la siguiente sintaxis: readConcern: { level: <value> }

Los posibles niveles de consistencia de lectura son estos:

Para obtener más información sobre los niveles de consistencia de lectura, consulta Nivel de consistencia de lectura.

La etapa $out no se puede usar junto con el nivel de consistencia de lectura "linearizable". Si especificas "linearizable" nivel de consistencia de lectura para db.collection.aggregate(), no podrás incluir la etapa $out en la pipeline.

La etapa $merge no se puede usar junto con el nivel de consistencia de lectura "linearizable". Es decir, si especificas el "linearizable" nivel de consistencia de lectura para db.collection.aggregate(), no puedes incluir la etapa $merge en la pipeline.

Documento

Opcional.

Especifica la intercalación a utilizar para la operación.

La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.

La opción de intercalación tiene la siguiente sintaxis:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Al especificar la intercalación, el campo locale es obligatorio; todos los demás campos de intercalación son opcionales. Para las descripciones de los campos, consulta Documento de intercalación.

Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver db.createCollection()), la operación utiliza la intercalación especificada para la colección.

Si no se especifica ninguna intercalación para la colección o para las operaciones, MongoDB utiliza la comparación binaria simple usada en versiones anteriores para las comparaciones de strings.

No puedes especificar varias intercalaciones para una operación. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una búsqueda con un ordenamiento, no puedes usar una intercalación para la búsqueda y otra para el ordenamiento.

hint

string o documento

Opcional. El índice que se utilizará para la agregación. El índice se encuentra en la colección/vista inicial sobre la cual se ejecuta la agregación.

Especifique el índice ya sea por su nombre o por el documento de especificación del índice.

Nota

El hint no se aplica a las etapas $lookup y $graphLookup.

comment

string

Opcional. Los usuarios pueden especificar una cadena arbitraria para facilitar el seguimiento de la operación mediante el generador de perfiles de base de datos, currentOp y los registros.

writeConcern

Documento

Opcional. Un documento que expresa el nivel de confirmación de escritura a utilizar con la etapa $out o $merge.

Omitir para usar el nivel de confirmación de escritura por defecto con la etapa $out o $merge.

let

Documento

Opcional.

Especifica un documento que contiene una lista de variables. Esto le permite mejorar la legibilidad de los comandos al separar las variables del texto de la query.

La sintaxis del documento es:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

La variable se establece en el valor devuelto por la expresión y no puede modificarse posteriormente.

Para acceder al valor de una variable en el comando, se debe usar el prefijo de doble signo de dólar ($$) junto con el nombre de la variable en la forma $$<variable_name>. Por ejemplo: $$targetTotal.

Para usar una variable como filtro de resultados en una etapa de $match del pipeline, se debe acceder a la variable dentro del operador $expr.

Para un ejemplo completo usando let y variables, vea Uso de variables en let.

Nuevo en la versión 5.0.

Si se produce un error, el asistente de aggregate() lanza una excepción.

mongoshEn, si el cursor devuelto por no está asignado a una variable mediante db.collection.aggregate() la var palabra clave, lo itera automáticamente mongosh hasta 20 veces. Consulte Iterar un cursor mongosh en para gestionar cursores mongosh en.

Los cursores devueltos por la agregación solo brindan soporte a métodos de cursor que operan en cursores evaluados (es decir, cursores cuya primera agrupación se recuperó), como los siguientes métodos:

Para obtener más información, consulte:

Para los cursores creados dentro de una sesión, no puedes llamar a getMore fuera de la sesión.

De manera similar, para los cursores creados fuera de una sesión, no puedes llamar a getMore dentro de una sesión.

Los drivers de MongoDB y mongosh asocian todas las operaciones con una sesión de servidor, con la excepción de las operaciones de escritura no reconocidas. Para las operaciones no asociadas explícitamente a una sesión (es decir, mediante Mongo.startSession()), los drivers de MongoDB y mongosh crean una sesión implícita y la asocian con la operación.

Si una sesión está inactiva durante más de 30 minutos, MongoDB Server marca esa sesión como expirada y puede cerrarla en cualquier momento. Cuando MongoDB Server cierra la sesión, también finaliza cualquier operación en curso y cierra los cursores abiertos asociados con la sesión. Esto incluye cursores configurados con noCursorTimeout() o un maxTimeMS() mayor a 30 minutos.

Para las operaciones que devuelven un cursor, si el cursor puede estar inactivo durante más de 30 minutos, emita la operación dentro de una sesión explícita usando Mongo.startSession() y actualice periódicamente la sesión usando el comando refreshSessions. Consulte Tiempo de espera de inactividad de la sesión para obtener más información.

db.collection.aggregate() puede usarse dentro de transacciones distribuidas.

Sin embargo, las siguientes etapas no están permitidas dentro de las transacciones:

Tampoco puede especificar la opción explain.

  • Para los cursores creados fuera de una transacción, no puedes llamar a getMore dentro de la transacción.

  • Para los cursores creados en una transacción, no puedes llamar a getMore fuera de la transacción.

Importante

En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.

Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.

Para la operación db.collection.aggregate() que no incluye las etapas $out o $merge:

Si el cliente que emitió db.collection.aggregate() se desconecta antes de que la operación se complete, MongoDB marca db.collection.aggregate() para su terminación usando killOp.

Los siguientes ejemplos utilizan la colección orders que contiene los siguientes documentos:

db.orders.insertMany( [
{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 },
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 },
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 },
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 },
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }
] )

La siguiente operación de agregación selecciona documentos con estado igual a "A", agrupa los documentos coincidentes por el campo cust_id y calcula el total para cada campo cust_id a partir de la suma del campo amount, y ordena los resultados por el campo total en orden descendente:

db.orders.aggregate( [
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
] )

La operación devuelve un cursor con los siguientes documentos:

[
{ _id: "xyz1", total: 100 },
{ _id: "abc1", total: 75 }
]

mongosh itera automáticamente el cursor devuelto para imprimir los resultados. Consulta Iterar un cursor en mongosh para manejar los cursores de forma manual en mongosh.

El siguiente ejemplo utiliza db.collection.explain() para ver información detallada sobre el plan de ejecución de la canalización de agregación.

db.orders.explain().aggregate( [
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
] )

La operación devuelve un documento que detalla el procesamiento de la canalización de agregación. Por ejemplo, el documento puede mostrar, entre otros detalles, qué índice, si lo hay, se utilizó en la operación. []1 Si la orders colección está fragmentada, el documento también mostrará la división del trabajo entre los fragmentos y la operación de fusión, y, para las consultas dirigidas, los fragmentos de destino.

Nota

Los lectores previstos del documento de salida explain son humanos, no máquinas, y el formato de salida está sujeto a cambios entre versiones.

Puedes ver una salida de explicación más detallada si pasa las modas de explicación executionStats o allPlansExecution al método db.collection.explain().

[1] Los filtros de índice pueden afectar la elección del índice utilizado. Consulta Filtros de Índice para obtener más detalles.

A partir de MongoDB 6.0, las etapas de la canalización que requieren más de 100 megabytes de memoria para ejecutarse escriben archivos temporales en el disco de forma predeterminada. Estos archivos temporales duran mientras se ejecuta la canalización y pueden afectar el espacio de almacenamiento de la instancia. En versiones anteriores de MongoDB, se debía pasar { allowDiskUse: true } a los comandos find y aggregate para habilitar este comportamiento.

Los comandos individuales find y aggregate pueden anular el parámetro allowDiskUseByDefault de las siguientes maneras:

  • Se utiliza { allowDiskUse: true } para permitir la escritura de archivos temporales en el disco cuando allowDiskUseByDefault se establece en false

  • Se utiliza { allowDiskUse: false } para prohibir la escritura de archivos temporales en el disco cuando allowDiskUseByDefault esté configurado en true

Los mensajes de registro del perfilador y los mensajes de registro de diagnóstico incluyen un indicador usedDisk si alguna etapa de agregación escribió datos en archivos temporales debido a restricciones de memoria.

Para obtener más información, consulte Límites de la pipeline de agregación.

Para especificar un tamaño de lote inicial para el cursor, utiliza la siguiente sintaxis para la opción cursor:

cursor: { batchSize: <int> }

Por ejemplo, la siguiente operación de agregación especifica el tamaño inicial de la agrupación de 0 para el cursor:

db.orders.aggregate(
[
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 2 }
],
{
cursor: { batchSize: 0 }
}
)

El documento { cursor: { batchSize: 0 } }, que especifica el tamaño del agrupación inicial, indica una primera agrupación vacía. Este tamaño de agrupación es útil para devolver rápidamente un cursor o un mensaje de error sin realizar un trabajo significativo en el servidor.

Para especificar el tamaño de agrupación para las operaciones getMore posteriores (después de la agrupación inicial), use el campo batchSize al ejecutar el comando getMore.

mongosh itera automáticamente el cursor devuelto para imprimir los resultados. Consulta Iterar un cursor en mongosh para manejar los cursores de forma manual en mongosh.

La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.

Una colección restaurants tiene los siguientes documentos:

db.restaurants.insertMany( [
{ _id: 1, category: "café", status: "Open" },
{ _id: 2, category: "cafe", status: "open" },
{ _id: 3, category: "cafE", status: "open" }
] )

La siguiente operación de agregación incluye la opción de intercalación:

db.restaurants.aggregate(
[
{ $match: { status: "Open" } },
{
$group: {
_id: "$category",
count: { $sum: 1 }
}
}
],
{ collation: { locale: "fr", strength: 1 } }
)
[ { _id: 'café', count: 3 } ]

La agregación especifica una intercalación con strength: 1, lo que significa que la intercalación ignora las diferencias entre mayúsculas y minúsculas y variantes de letras. Como resultado:

  • El filtro $match coincide con todos los documentos de la colección y pasa esos documentos a la fase $group.

  • La etapa $group ignora las diferencias en las variantes de letras en el campo category y coloca todos los documentos en un solo grupo.

Nota

Si realiza una agregación que implique varias vistas, como con $lookup o $graphLookup, las vistas deben tener la misma intercalación.

Para obtener descripciones sobre los campos de intercalación, consulta el Documento de intercalación.

Cree una colección food con los siguientes documentos:

db.food.insertMany( [
{ _id: 1, category: "cake", type: "chocolate", qty: 10 },
{ _id: 2, category: "cake", type: "ice cream", qty: 25 },
{ _id: 3, category: "pie", type: "boston cream", qty: 20 },
{ _id: 4, category: "pie", type: "blueberry", qty: 15 }
] )

Cree los siguientes índices:

db.food.createIndex( { qty: 1, type: 1 } );
db.food.createIndex( { qty: 1, category: 1 } );

La siguiente operación de agregación incluye la opción hint para forzar el uso del índice especificado:

db.food.aggregate(
[ { $sort: { qty: 1 }}, { $match: { category: "cake", qty: 10 } }, { $sort: { type: -1 } } ],
{ hint: { qty: 1, category: 1 } }
)

Utiliza la opción readConcern para especificar el nivel de consistencia de lectura de la operación.

No puedes utilizar la etapa $out o la etapa $merge junto con el nivel de consistencia de lectura "linearizable". Es decir, si especificas el nivel de consistencia de lectura "linearizable" para db.collection.aggregate(), no podrá incluir ninguna de las dos etapas en la pipeline.

La siguiente operación en un set de réplicas especifica un nivel de consistencia de lectura de "majority" para leer la copia más reciente de los datos confirmados como están escritos en la mayoría de los nodos.

Nota

  • Para asegurarte de que un solo hilo pueda leer sus propias escrituras, utiliza el nivel de consistencia de lectura "majority" y el nivel de confirmación de escritura "majority" contra el primario del set de réplicas.

  • Puede especificar el nivel de consistencia de lectura "majority" para una agregación que incluya una etapa $out.

  • Independientemente del nivel de consistencia de lectura, es posible que los datos más recientes de un nodo no reflejen la versión más reciente de los datos en el sistema.

db.restaurants.aggregate(
[ { $match: { rating: { $lt: 5 } } } ],
{ readConcern: { level: "majority" } }
)

Una colección llamada movies contiene documentos con el siguiente formato:

db.movies.insertOne(
{
_id: ObjectId("599b3b54b8ffff5d1cd323d8"),
title: "Jaws",
year: 1975,
imdb: "tt0073195"
}
)

La siguiente operación de agregación encuentra películas creadas en 1995 e incluye la opción comment para proporcionar información de seguimiento en logs, la colección db.system.profile, y db.currentOp.

db.movies.aggregate( [ { $match: { year : 1995 } } ], { comment : "match_all_movies_from_1995" } ).pretty()

En un sistema con perfilado activado, puedes consultar la colección system.profile para ver todas las agregaciones similares recientes, como se muestra a continuación:

db.system.profile.find( { "command.aggregate": "movies", "command.comment" : "match_all_movies_from_1995" } ).sort( { ts : -1 } ).pretty()

Esto devolverá un conjunto de resultados del perfilador en el siguiente formato:

{
"op" : "command",
"ns" : "video.movies",
"command" : {
"aggregate" : "movies",
"pipeline" : [
{
"$match" : {
"year" : 1995
}
}
],
"comment" : "match_all_movies_from_1995",
"cursor" : {
},
"$db" : "video"
},
...
}

Una aplicación puede codificar cualquier información arbitraria en el comentario para rastrear o identificar más fácilmente operaciones específicas a través del sistema. Por ejemplo, una aplicación podría adjuntar un comentario de string que incorpore su ID de proceso, ID de hilo, nombre de host del cliente y el usuario que emitió el comando.

Nuevo en la versión 5.0.

Para definir variables a las que puedes acceder en otros lugares del comando, utiliza la opción let.

Nota

Para filtrar resultados usando una variable en una etapa de la pipeline $match, debe acceder a la variable dentro del operador $expr.

Cree una colección cakeSales que contenga ventas de sabores de pastel:

db.cakeSales.insertMany( [
{ _id: 1, flavor: "chocolate", salesTotal: 1580 },
{ _id: 2, flavor: "strawberry", salesTotal: 4350 },
{ _id: 3, flavor: "cherry", salesTotal: 2150 }
] )

El siguiente ejemplo:

  • recupera el pastel que tiene un salesTotal mayor que 3000, que es el pastel con un _id de 2

  • define una variable targetTotal en let, la cual se referencia en $gt como $$targetTotal

db.cakeSales.aggregate(
[
{ $match: {
$expr: { $gt: [ "$salesTotal", "$$targetTotal" ] }
} }
],
{ let: { targetTotal: 3000 } }
)

Volver

sp.processor.stop

En esta página