Docs Menu
Docs Home
/ /

$out (etapa de agregación)

$out

Toma 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 $out debe ser la última etapa del pipeline. El operador $out permite que el marco de agregación devuelva conjuntos de resultados de cualquier tamaño.

Advertencia

Si la colección especificada por la operación $out ya existe, entonces la etapa $out reemplaza de forma atómica la colección existente con la nueva colección de resultados al completar la agregación. Ver Reemplazar colección existente para más detalles.

La etapa $out tiene la siguiente sintaxis:

  • $out puede 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
  • $out puede 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>" } }
  • A partir de MongoDB 7.0.3 y 7.1, $out puede llevar un documento a una salida colección de series temporales:

    { $out:
    { db: "<output-db>", coll: "<output-collection>",
    timeseries: {
    timeField: "<field-name>",
    metaField: "<field-name>",
    granularity: "seconds" || "minutes" || "hours" ,
    }
    }
    }

    Importante

    Cambio de la granularidad de las series de tiempo

    Después de crear una colección de series de tiempo, se puede modificar la granularidad utilizando el método collMod. Sin embargo, solo se puede aumentar el intervalo de tiempo cubierto por cada bucket. No se puede disminuir.

    Campo
    Descripción

    db

    El 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, $out también crea la base de datos.

    coll

    El nombre de la colección de salida.

    timeseries

    Un documento que especifica la configuración a utilizar al escribir en una colección de series de tiempo. El timeField es necesario. Todos los demás campos son opcionales.

    timeField

    Requerido al escribir en una colección de series de tiempo. El nombre del campo que contiene la fecha en cada documento de serie de tiempo. Los documentos en una colección de series de tiempo deben tener una fecha BSON válida como valor para el timeField.

    metaField

    Opcional. El nombre del campo que contiene los metadatos en cada documento de serie de tiempo. Los metadatos del campo especificado deben ser datos que se utilicen para etiquetar una serie única de documentos. Los metadatos difícilmente cambien. El nombre del campo especificado no puede ser _id ni el mismo que el timeseries.timeField. El campo puede ser de cualquier tipo de dato.

    Aunque el campo metaField es opcional, el uso de metadatos puede mejorar la optimización de query. Por ejemplo, MongoDB crea un índice compuesto automáticamente en los campos metaField y timeField para las nuevas colecciones. Si no proporcionas un valor para este campo, los datos se agrupan únicamente en función del tiempo.

    granularity

    Opcional. No utilice si se configuran bucketRoundingSeconds y bucketMaxSpanSeconds.

    Los valores posibles son seconds (por defecto), minutes y hours.

    Configure granularity al valor que más se asemeje al intervalo de tiempo entre las marcas de tiempo entrantes consecutivas. Esto mejora el rendimiento al optimizar cómo MongoDB almacena los datos en la colección.

    Para obtener más información sobre la granularidad y los intervalos de agrupación, consulta Configurar granularidad para datos de series de tiempo.

    bucketMaxSpanSeconds

    Opcional. Utilice con bucketRoundingSeconds como alternativa a granularity. Establece el tiempo máximo entre marcas de tiempo en el mismo bucket.

    Los valores posibles son de 1 a 31536000.

    Nuevo en la versión 6.3.

    bucketRoundingSeconds

    Opcional. Utilice con bucketMaxSpanSeconds como alternativa a granularity. Debe ser igual a bucketMaxSpanSeconds.

    Cuando un documento requiere un nuevo bucket, MongoDB redondea hacia abajo el valor de la marca de tiempo del documento según este intervalo para establecer el tiempo mínimo para el bucket.

    Nuevo en la versión 6.3.

Importante

  • No puede especificar una colección fragmentada como la colección de salida. La colección de entrada para un pipeline se puede fragmentar. Para exportar a una colección fragmentada, consulta $merge.

  • El operador $out no puede guardar resultados en una colección con tamaño fijo.

  • Si modificas una colección con un índice de búsqueda de MongoDB, primero debes borrar y luego volver a crear el índice de búsqueda. Considera usar $merge en su lugar.

MongoDB ofrece dos etapas, $merge y $out, para escribir los resultados del pipeline de agregación en una colección. A continuación, se resumen las capacidades de las dos etapas:

$out
  • Se puede enviar a una colección en la misma base de datos o en una base de datos diferente.

  • Se puede enviar a una colección en la misma base de datos o en una base de datos diferente.

  • Cree una nueva colección si la colección de salida no existe ya.

  • Cree una nueva colección si la colección de salida no existe ya.

  • Se debe reemplazar por completo la colección de salida si ya existe.

  • Puede incorporar resultados (insertar nuevos documentos, fusionar documentos, reemplazar documentos, mantener documentos existentes, fallar la operación, procesar documentos con un pipeline de actualización personalizado) en una colección existente.

    Puedes reemplazar el contenido de la colección, pero solo si los resultados de la agregación contienen una coincidencia con todos los documentos existentes de la colección.

  • No se puede enviar a una colección particionada. Sin embargo, la colección de entrada se puede particionar.

  • Puede dar salida a una colección fragmentada. La colección de entrada también se puede fragmentar.

  • A partir de MongoDB 7.0.3 y 7.1, puede generar salida en una colección de series de tiempo.

  • No se puede generar salida a una colección de series de tiempo.

  • Corresponde a las instrucciones SQL:

    • INSERT INTO T2 SELECT * FROM T1
    • SELECT * INTO T2 FROM T1
  • Corresponde a la instrucción SQL:

    • MERGE T2 AS TARGET
      USING (SELECT * FROM T1) AS SOURCE
      ON MATCH (T2.ID = SOURCE.ID)
      WHEN MATCHED THEN
      UPDATE SET TARGET.FIELDX = SOURCE.FIELDY
      WHEN NOT MATCHED THEN
      INSERT (FIELDX)
      VALUES (SOURCE.FIELDY)
    • Crear/actualizar vistas materializadas

A partir de MongoDB 5.0, $out puede ejecutarse en nodos secundarios de un set de réplicas si todos los nodos del clúster tienen featureCompatibilityVersion configurado como 5.0 o superior y la preferencia de lectura configurada como secundaria.

Las operaciones de lectura de la instrucción $out ocurren en los nodos secundarios, mientras que las operaciones de guardado ocurren solo en los nodos primarios.

No todas las versiones del driver son compatibles con la dirección de las operaciones $out a los nodos secundarios del set de réplicas. Se debe consultar la documentación del driver para ver cuándo el driver agregó soporte para $out ejecutado en un nodo secundario.

La operación $out crea una nueva colección si aún no existe.

La colección aparece cuando se completa la agregación. Si la agregación falla, MongoDB no crea la colección.

Si la colección especificada por la operación $out ya existe, entonces, al completar la agregación, la etapa $out reemplaza de forma atómica la colección existente con la nueva colección de resultados. Específicamente, la operación $out:

  1. Crea una colección temporal.

  2. Copia los índices de la colección existente a la colección temporal.

  3. Inserta los documentos en la colección temporal.

  4. Llama al comando renameCollection con dropTarget: true para renombrar la colección temporal a la colección de destino.

Si la colección especificada existe y la operación $out especifica las opciones timeseries, se aplican las siguientes restricciones:

  1. La colección existente debe ser una colección de series de tiempo.

  2. La colección existente no debe ser una vista.

  3. Las opciones timeseries incluidas en la etapa $out deben coincidir exactamente con las de la colección existente.

La operación $out no modifica ningún índice que existiera en la colección anterior. Si la agregación falla, la operación $out no realiza cambios en la colección preexistente.

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.

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 de búsqueda de MongoDB, debes borrar y volver a crear el índice de búsqueda. Considera usar $merge en su lugar.

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

Un mongodump iniciado con --oplog falla si un cliente emite un pipeline de agregación que incluye $out durante el proceso de vaciado. Consulta mongodump --oplog para obtener más información.

Restricciones
Descripción

La pipeline de agregación no puede usar $out dentro de transacciones.

La etapa $out no está permitida como parte de la definición de una vista. Si la definición de la vista incluye una pipeline anidada (por ejemplo, la definición de la vista incluye la etapa $lookup o $facet), esta restricción de la etapa $out también se aplica a las pipelines anidadas.

$lookup etapa

No puedes incluir la etapa $out etapa en el pipeline anidado de la etapa $lookup.

$facet etapa

El pipeline anidado de la etapa $facet no puede incluir la etapa $out.

El pipeline anidado de la etapa $unionWith no puede incluir la etapa $out.

"linearizable" readConcern

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.

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.

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 $group agrupa por authors y utiliza $push para añadir los títulos a un campo de arreglo books:

{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
Segunda etapa ($out):
La etapa $out envía los documentos a la colección authors en la base de datos test.

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

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.

$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 $group agrupa por authors y utiliza $push para añadir los títulos a un campo de arreglo books:

{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
Segunda etapa ($out):
La etapa $out envía los documentos a la colección authors en la base de datos reporting.

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

Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.

La siguiente clase Movie modela los documentos en la colección sample_mflix.movies:

public class Movie
{
public ObjectId Id { get; set; }
public int Runtime { get; set; }
public string Title { get; set; }
public string Rated { get; set; }
public List<string> Genres { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public int Year { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

Nota

ConventionPack para Pascal Case

Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

Para usar el controlador MongoDB.NET/C# para agregar una $out etapa a una canalización de agregación, llame a Out()método en un PipelineDefinition objeto.

El siguiente ejemplo crea una etapa de pipeline que escribe los resultados del pipeline en la colección movies:

var movieCollection = client
.GetDatabase("sample_mflix")
.GetCollection<Movie>("movies");
var pipeline = new EmptyPipelineDefinition<Movie>()
.Out(movieCollection);

Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $out a una canalización de agregación, utilice el Operador $out en un objeto de canalización.

El siguiente ejemplo crea una etapa del pipeline que escribe los resultados del pipeline en la colección movies. A continuación, el ejemplo ejecuta el pipeline de agregación:

const pipeline = [{ $out: { db: "sample_mflix", coll: "movies" } }];
const cursor = collection.aggregate(pipeline);
return cursor;

Volver

$merge

En esta página