Navigation
This version of the documentation is archived and no longer supported.

$out (aggregation)

Definition

$out

Takes the documents returned by the aggregation pipeline and writes them to a specified collection. The $out operator must be the last stage in the pipeline. The $out operator lets the aggregation pipeline return result sets of any size.

Changed in version 3.2.0.

The $out stage has the following prototype form:

{ $out: "<output-collection>" }

$out takes a string that specifies the output collection name.

Important

  • You cannot specify a sharded collection as the output collection. The input collection for a pipeline can be sharded. To output to a sharded collection, see $merge (Available starting in MongoDB 4.2).
  • The $out operator cannot write results to a capped collection.

Comparison with $merge

With the introduction of $merge in version 4.2, MongoDB provides two stages, $merge and $out, for writing the results of the aggregation pipeline to a collection. The following summarizes the capabilities of the two stages:

$out $merge
  • Can output to a collection in the same or, starting in MongoDB 4.4, different database.
  • Can output to a collection in the same or different database.
  • Creates a new collection if the output collection does not already exist.
  • Creates a new collection if the output collection does not already exist.
  • Replaces the output collection completely if it already exists.
  • Can incorporate results (insert new documents, merge documents, replace documents, keep existing documents, fail the operation, process documents with a custom update pipeline) into an existing collection.

    Can replace the content of the collection but only if the aggregation results contain a match for all existing documents in the collection.

  • Cannot output to a sharded collection. Input collection, however, can be sharded.
  • Can output to a sharded collection. Input collection can also be sharded.
  • Corresponds to the SQL statements:

    • INSERT INTO T2 SELECT * FROM T1
      
    • SELECT * INTO T2 FROM T1
      
  • Corresponds to the SQL statement:

    • 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)
      
    • Create/Refresh Materialized Views

Behaviors

Create New Collection

The $out operation creates a new collection in the current database if one does not already exist. The collection is not visible until the aggregation completes. If the aggregation fails, MongoDB does not create the collection.

Replace Existing Collection

If the collection specified by the $out operation already exists, then upon completion of the aggregation, the $out stage atomically replaces the existing collection with the new results collection. Specifically, the $out operation:

  1. Creates a temp collection.
  2. Copies the indexes from the existing collection to the temp collection.
  3. Inserts the documents into the temp collection.
  4. Calls db.collection.renameCollection with dropTarget: true to rename the temp collection to the destination collection.

The $out operation does not change any indexes that existed on the previous collection. If the aggregation fails, the $out operation makes no changes to the pre-existing collection.

Index Constraints

The pipeline will fail to complete if the documents produced by the pipeline would violate any unique indexes, including the index on the _id field of the original output collection.

If the $out operation modifies a collection with an Atlas Search index, you must delete and re-create the search index. Consider using $merge instead.

Transactions

$out is not allowed in transactions.

Views

New in version 4.2.

The $out stage is not allowed as part of a view definition. If the view definition includes nested pipeline (e.g. the view definition includes $lookup or $facet stage), this $out stage restriction applies to the nested pipelines as well. [1]

[1]Starting in 4.2, you cannot include the $out stage in the $lookup stage’s nested pipeline, regardless of whether the $lookup is part of a view definition.

linearizable Read Concern

Starting in MongoDB 4.2, the $out stage cannot be used in conjunction with read concern "linearizable". That is, if you specify "linearizable" read concern for db.collection.aggregate(), you cannot include the $out stage in the pipeline.

majority Read Concern

Starting in MongoDB 4.2, you can specify read concern level "majority" for an aggregation that includes an $out stage.

Interaction with mongodump

A mongodump started with --oplog fails if a client issues an aggregation pipeline that includes $out during the dump process. See mongodump --oplog for more information.

Example

A collection books contains the following documents:

{ "_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 }

The following aggregation operation pivots the data in the books collection to have titles grouped by authors and then writes the results to the authors collection.

db.books.aggregate( [
                      { $group : { _id : "$author", books: { $push: "$title" } } },
                      { $out : "authors" }
                  ] )

After the operation, the authors collection contains the following documents:

{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }