DefiniciĂłn
aggregateRealiza operaciones de agregaciĂłn utilizando el pipeline de agregaciĂłn. El pipeline permite a los usuarios procesar datos de una colecciĂłn u otra fuente mediante una secuencia de manipulaciones basadas en etapas.
Tip
En
mongosh, este comando también se puede ejecutar a través de los métodos asistentesdb.aggregate()ydb.collection.aggregate()o con el método asistentewatch().Los métodos asistente son convenientes para usuarios de
mongosh, pero es posible que no proporcionen el mismo nivel de informaciĂłn que los comandos de base de datos. En los casos en que no se necesite la conveniencia o se requieran campos de retorno adicionales, utiliza el comando de base de datos.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
- MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Importante
Este comando tiene soporte limitado en los clústeres Flex y M0. Para obtener más información, consulta Comandos no compatibles.
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.
Sintaxis
Modificado en la 5.0 versiĂłn.:
El comando tiene la siguiente sintaxis:
db.runCommand( { aggregate: "<collection>" || 1, pipeline: [ <stage>, <...> ], explain: <boolean>, allowDiskUse: <boolean>, cursor: <document>, maxTimeMS: <int>, bypassDocumentValidation: <boolean>, readConcern: <document>, collation: <document>, hint: <string or document>, comment: <any>, writeConcern: <document>, let: <document> // Added in MongoDB 5.0 } )
Campos de comandos
El comando aggregate toma los siguientes campos como argumentos:
Campo | Tipo | DescripciĂłn | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | El nombre de la colecciĂłn o vista que sirve como entrada para el pipeline de agregaciĂłn. Utilizar | ||||||||||
| arreglo | Un arreglo de las etapas del pipeline de agregaciĂłn que procesan y transforman el flujo de documentos como parte del pipeline de agregaciĂłn. | ||||||||||
| booleano | Opcional. Especificar devolver la informaciĂłn sobre el procesamiento del pipeline. No disponible en transacciones multi-documento. | ||||||||||
| booleano | Opcional. Usa esta opciĂłn para anular
A partir de MongoDB 6.0, si Para obtener más detalles, consulte Los mensajes de registro del perfilador y los mensajes de registro de diagnóstico incluyen un indicador | ||||||||||
| Documento | Especificar un documento que contenga opciones que controlen la creaciĂłn del objeto cursor. Debe utilizar el comando
| ||||||||||
| non-negative integer | Opcional. Especifica un lĂmite de tiempo en milisegundos. Si no especifica un valor para MongoDB finaliza las operaciones que exceden su lĂmite de tiempo asignado utilizando el mismo mecanismo que | ||||||||||
| booleano | |||||||||||
| Documento | Opcional. Especifica el nivel de consistencia de lectura. La opciĂłn 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 La etapa | ||||||||||
| Documento | Opcional. Opcional. Especifica la intercalaciĂłn que se debe 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: Al especificar la intercalaciĂłn, el campo Si no se especifica la intercalaciĂłn, pero la colecciĂłn tiene una intercalaciĂłn por defecto (ver 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. | ||||||||||
| 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. El | ||||||||||
| any | Opcional. Un comentario proporcionado por el usuario para adjuntar a este comando. Una vez configurado, este comentario aparece junto a los registros de este comando en las siguientes ubicaciones:
Un comentario puede ser de cualquier tipo BSON válido (string, objeto, arreglo, etc.). Cualquier comentario establecido en un comando | ||||||||||
| Documento | Opcional. Un documento que expresa el nivel de confirmaciĂłn de escritura a utilizar con la etapa Omitir para usar el nivel de confirmaciĂłn de escritura por defecto con la etapa | ||||||||||
| 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: 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 ( Para usar una variable como filtro de resultados en una etapa de Para un ejemplo completo usando Novedad 5.0 en la versiĂłn.: |
Debe utilizar el comando aggregate con la opciĂłn cursor a menos que el comando incluya la opciĂłn explain.
Para indicar un cursor con el tamaño de agrupación por defecto, se debe especificar
cursor: {}.Para indicar un cursor con un tamaño de agrupación distinto al establecido por defecto, se debe utilizar
cursor: { batchSize: <num> }.
Para obtener más información sobre la canalización de agregación, consulte:
Sesiones
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.
Tiempo de espera de inactividad de la 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.
Transacciones
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
getMoredentro de la transacciĂłn.Para los cursores creados en una transacciĂłn, no puedes llamar a
getMorefuera 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.
DesconexiĂłn del cliente
Para la operaciĂłn aggregate que no incluye las etapas $out o $merge:
Si el cliente que emitiĂł aggregate se desconecta antes de que la operaciĂłn se complete, MongoDB marca aggregate para su terminaciĂłn usando killOp.
Stable API
Cuando se debe utilizar Stable API V1:
No puede usar las siguientes etapas en un comando
aggregate:No se debe incluir el campo
explainen un comandoaggregate. Si se hace esto, el servidor devuelve un error APIStrictError.Al utilizar la etapa
$collStats, solo puede utilizar el campocount. No hay otros campos$collStatsdisponibles.
Ejemplo
Debe utilizar el comando aggregate con la opciĂłn cursor a menos que el comando incluya la opciĂłn explain.
Para indicar un cursor con el tamaño de agrupación por defecto, se debe especificar
cursor: {}.Para indicar un cursor con un tamaño de agrupación distinto al establecido por defecto, se debe utilizar
cursor: { batchSize: <num> }.
En lugar de ejecutar el comando aggregate directamente, la mayorĂa de los usuarios deben utilizar el asistente db.collection.aggregate() proporcionado en mongosh o el asistente equivalente en su driver. En 2.6 y versiones posteriores, el asistente db.collection.aggregate() siempre devuelve un cursor.
Excepto por los dos primeros ejemplos que demuestran la sintaxis del comando, los ejemplos de esta página utilizan el asistente db.collection.aggregate().
AgregaciĂłn de datos con pipeline multi-etapas
Una colecciĂłn articles contiene documentos como los siguientes:
{ _id: ObjectId("52769ea0f3dc6ead47c9a1b2"), author: "abc123", title: "zzz", tags: [ "programming", "database", "mongodb" ] }
El siguiente ejemplo realiza una operaciĂłn aggregate en la colecciĂłn articles para calcular el recuento de cada elemento distinto en el arreglo tags que aparece en la colecciĂłn.
db.runCommand( { aggregate: "articles", pipeline: [ { $project: { tags: 1 } }, { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum : 1 } } } ], cursor: { } } )
En mongosh, esta operaciĂłn puede usar el asistentedb.collection.aggregate() como en el siguiente ejemplo:
db.articles.aggregate( [ { $project: { tags: 1 } }, { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum : 1 } } } ] )
Usar $currentOp en una base de datos admin
El siguiente ejemplo ejecuta un pipeline con dos etapas en la base de datos admin. La primera etapa ejecuta la operaciĂłn $currentOp y la segunda etapa filtra los resultados de esa operaciĂłn.
db.adminCommand( { aggregate : 1, pipeline : [ { $currentOp : { allUsers : true, idleConnections : true } }, { $match : { shard : "shard01" } } ], cursor : { } } )
Nota
El comando aggregate no especifica una colecciĂłn y en su lugar adopta la forma {aggregate: 1}. Esto se debe a que la etapa inicial $currentOp no obtiene la entrada de una colecciĂłn. Produce sus propios datos que el resto del pipeline utiliza.
Se ha añadido el nuevo asistente db.aggregate() para asistir en la ejecuciĂłn de agregaciones sin colecciĂłn como esta. La agregaciĂłn anterior tambiĂ©n podrĂa ejecutarse como este ejemplo.
InformaciĂłn sobre la operaciĂłn de agregaciĂłn
La siguiente operaciĂłn de agregaciĂłn establece el campo opcional explain en true para devolver informaciĂłn sobre la operaciĂłn de agregaciĂłn.
db.orders.aggregate([ { $match: { status: "A" } }, { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }, { $sort: { total: -1 } } ], { explain: true } )
Nota
La salida explicativa está sujeta a cambios entre versiones.
Tip
db.collection.aggregate() Método
InteracciĂłn con allowDiskUseByDefault
A partir de MongoDB 6.0, las etapas del pipeline que requieren más de 100 megabytes de memoria para ejecutarse escriben archivos temporales en el disco de forma predeterminada. Estos archivos temporales duran toda la ejecución del pipeline y pueden influir en el espacio de almacenamiento en la instancia. En versiones anteriores de MongoDB, se debe pasar { allowDiskUse: true } a los comandos individuales 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 cuandoallowDiskUseByDefaultse establece enfalseSe utiliza
{ allowDiskUse: false }para prohibir la escritura de archivos temporales en el disco cuandoallowDiskUseByDefaultesté configurado entrue
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.
Agregación de datos especificando el tamaño de agrupación
Para especificar un tamaño inicial de agrupación, se debe especificar el batchSize en el campo cursor, como en el siguiente ejemplo:
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.
Especifica una intercalaciĂł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.
Una colecciĂłn myColl tiene los siguientes documentos:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
La siguiente operaciĂłn de agregaciĂłn incluye la opciĂłn de intercalaciĂłn:
db.myColl.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$category", count: { $sum: 1 } } } ], { collation: { locale: "fr", strength: 1 } } );
Para obtener descripciones sobre los campos de intercalaciĂłn, consulta el Documento de intercalaciĂłn.
Sugerencia de Ăndice
Cree una colecciĂłn foodColl con los siguientes documentos:
db.foodColl.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.foodColl.createIndex( { qty: 1, type: 1 } ); db.foodColl.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.foodColl.aggregate( [ { $sort: { qty: 1 }}, { $match: { category: "cake", qty: 10 } }, { $sort: { type: -1 } } ], { hint: { qty: 1, category: 1 } } )
Anular el nivel de consistencia de lectura por defecto
Para anular el nivel de consistencia de lectura por defecto, se debe utilizar la opciĂłn readConcern. El comando getMore utiliza el nivel readConcern especificado en el comando aggregate de origen.
No puede utilizar la etapa $out o la etapa $merge junto con el nivel de consistencia de lectura "linearizable". Es decir, si especifica el nivel de consistencia de lectura "linearizable" para db.collection.aggregate(), no puede incluir ninguna de las dos etapas en el 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.
Importante
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" } } )
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.
Usar variables en let
Novedad 5.0 en la versiĂłn.:
Para definir variables a las que puedas acceder en otras partes del comando, utiliza la opciĂłn let.
Nota
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
salesTotalmayor que 3000, que es el pastel con un_idde 2define una variable
targetTotalenlet, la cual se referencia en$gtcomo$$targetTotal
db.runCommand( { aggregate: db.cakeSales.getName(), pipeline: [ { $match: { $expr: { $gt: [ "$salesTotal", "$$targetTotal" ] } } }, ], cursor: {}, let: { targetTotal: 3000 } } )