Definición
$outToma los documentos devueltos por la canalización de agregación y los guarda en una colección especificada. Puede especificar la base de datos de salida.
La etapa
$outdebe ser la última del pipeline. El operador permite que el marco de agregación devuelva conjuntos de resultados de cualquier$outtamaño.
Sintaxis
La etapa $out tiene la siguiente sintaxis:
$outpuede utilizar un documento para especificar la base de datos de salida, así como la colección de salida:{ $out: { db: "<output-db>", coll: "<output-collection>" } } CampoDescripciónEl nombre de la base de datos de salida.
Para un set de réplicas o un autónomo, si la base de datos de salida no existe,
$outtambién crea la base de datos.Para un clúster particionado, la base de datos de salida especificada ya debe existir.
El nombre de la colección de salida.
$outpuede tomar un string para especificar solo la colección de salida (es decir, salida a una colección en la misma base de datos):{ $out: "<output-collection>" } // Output collection is in the same database
Importante
No se puede especificar una colección fragmentada como colección de salida. La colección de entrada de una canalización sí se puede fragmentar. Para generar una colección fragmentada, consulte (disponible a partir de
$mergeMongoDB).4.2El operador
$outno puede escribir resultados en una colección con tamaño fijo.Si modifica una colección con un índice de búsqueda Atlas, primero debe eliminar y luego volver a crear el índice de búsqueda. Considere usar en su
$mergelugar.
Comparación con $merge
Con la introducción de en $merge la 4.2 versión, MongoDB ofrece dos etapas, y, para escribir los resultados de la canalización de agregación en una colección. A continuación, se resumen las capacidades de ambas$merge $outetapas:
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
| ||||||||||
|
|
Comportamientos
Ejecutar operaciones de lectura $out en nodos secundarios del set de réplicas
A partir de MongoDB,5.0 $out puede ejecutarse en nodos secundarios del conjunto de réplicas si todos los nodos del clúster tienen featureCompatibilityVersion configurado en 5.0 o superior y la preferencia de lectura está configurada en secundaria.
Las operaciones de lectura de la $out instrucción ocurren en los nodos secundarios, mientras que las operaciones de escritura ocurren solo en los nodos primarios.
No todas las versiones del controlador admiten la asignación de $out operaciones a nodos secundarios del conjunto de réplicas. Consulte la documentación del controlador para ver cuándo se agregó compatibilidad con $out ejecutándose en un nodo secundario.
Crear nueva colección
La operación crea una nueva colección si aún no existe $out una.
La colección aparece cuando se completa la agregación. Si la agregación falla, MongoDB no crea la colección.
Sustituir la colección existente
Si la colección especificada por la operación ya existe,$out al finalizar la agregación, la etapa reemplaza automáticamente la colección existente con $out $out la nueva colección de resultados. En concreto, la operación:
Crea una colección temporal.
Copia los índices de la colección existente a la colección temporal.
Inserta los documentos en la colección temporal.
Llama al comando
renameCollectioncondropTarget: truepara renombrar la colección temporal a la colección de destino.
La operación no modifica ningún índice existente en $out $out la colección anterior. Si la agregación falla, la operación no modifica la colección preexistente.
Errores de validación de esquema
Si su colección coll utiliza la validación de esquemas y tiene validationAction establecido en error, al insertar un documento no válido con $out se arroja un error. La operación $out no realiza cambios en la colección preexistente y los documentos devueltos por la canalización de agregación no se añaden a la colección coll.
Restricciones de índices
El pipeline no se completará si los documentos producidos por el mismo violan algunos índices únicos, incluido el índice en el campo _id de la colección de salida original.
Si la operación $out modifica una colección con un índice Atlas Search, debe eliminar y volver a crear el índice de búsqueda. Considere usar $merge en su lugar.
majority readConcern
Puede especificar el nivel de consistencia de lectura "majority" para una agregación que incluya una etapa $out.
Interacción con mongodump
Un mongodump iniciado con falla si un --oplog $out cliente emite una canalización de agregación que incluye mongodump --oplog durante el proceso de volcado. Consulte para obtener más información.
Restricciones
Restricciones | Descripción |
|---|---|
Una canalización de agregación no puede utilizar | |
Un pipeline de agregación no puede usar | |
La | |
| A partir 4.2 de, no se puede incluir la etapa en la canalización |
|
|
|
|
| La etapa |
Ejemplos
En la base de datos test, cree una colección books con los siguientes documentos:
db.getSiblingDB("test").books.insertMany([ { "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 }, { "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 }, { "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 }, { "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 }, { "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 } ])
Si la base de datos test no existe aún, la operación de inserción crea la base de datos así como la colección books.
Salida a la misma base de datos
La siguiente operación de agregación dinamiza los datos de la colección books en la base de datos test para tener los títulos agrupados por autores y, a continuación, guarda los resultados en la colección authors, también en la base de datos test.
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : "authors" } ] )
- Primera etapa (
$group): La etapa de
$groupagrupa porauthorsy utiliza$pushpara añadir los títulos a un campo de arreglobooks:{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } - Segunda etapa (
$out): - La etapa envía los documentos a
$outlaauthorscolección en latestbase de datos.
Para ver los documentos en la colección de salida, ejecute la siguiente operación:
db.getSiblingDB("test").authors.find()
La colección contiene los siguientes documentos:
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
Salida a una base de datos diferente
Nota
Para un set de réplicas o un autónomo, si la base de datos de salida no existe, $out también crea la base de datos.
Para un clúster particionado, la base de datos de salida especificada ya debe existir.
$out puede generar salida a una colección en una base de datos diferente de donde se ejecuta la agregación.
La siguiente operación de agregación dinamiza los datos de la colección books para agrupar los títulos por autores y luego guarda los resultados en la colección authors de la base de datos reporting:
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : { db: "reporting", coll: "authors" } } ] )
- Primera etapa (
$group): La etapa de
$groupagrupa porauthorsy utiliza$pushpara añadir los títulos a un campo de arreglobooks:{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } - Segunda etapa (
$out): - La etapa envía los documentos a
$outlaauthorscolección en lareportingbase de datos.
Para ver los documentos en la colección de salida, ejecute la siguiente operación:
db.getSiblingDB("reporting").authors.find()
La colección contiene los siguientes documentos:
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }