On this page本页内容
$out
Takes the documents returned by the aggregation pipeline and writes them to a specified collection. 获取聚合管道返回的文档并将其写入指定集合。Starting in MongoDB 4.4, you can specify the output database.从MongoDB 4.4开始,您可以指定输出数据库。
The $out
stage must be the last stage in the pipeline. $out
阶段必须是管道中的最后一个阶段。The $out
operator lets the aggregation framework return result sets of any size.$out
运算符允许聚合框架返回任意大小的结果集。
$out
replaces the specified collection if it exists. 替换指定的集合(如果存在)。See Replace Existing Collection for details.有关详细信息,请参阅替换现有集合。
The $out
stage has the following syntax:$out
阶段语法如下:
Starting in MongoDB 4.4, 从MongoDB 4.4开始,$out
can take a document to specify the output database as well as the output collection:$out
可以使用文档指定输出数据库和输出集合:
{ $out: { db: "<output-db>", coll: "<output-collection>" } }
db |
|
coll |
|
$out
can take a string to specify only the output collection (i.e. output to a collection in the same database):可以使用字符串指定输出集合(即输出到同一数据库中的集合):
{ $out: "<output-collection>" } // Output collection is in the same database
$merge
(Available starting in MongoDB 4.2).$merge
(从MongoDB 4.2开始提供)。$out
operator cannot write results to a capped collection.$out
运算符无法将结果写入到封顶集合。$merge
instead.$merge
。$merge
$merge
的比较With the introduction of 随着4.2版引入$merge
in version 4.2, MongoDB provides two stages, $merge
and $out
, for writing the results of the aggregation pipeline to a collection. $merge
,MongoDB提供了两个阶段$merge
和$out
,用于将聚合管道的结果写入集合。The following summarizes the capabilities of the two stages:以下总结了两个阶段的能力:
$out | $merge |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
$out
读取操作在辅助副本集成员上运行Starting in MongoDB 4.4, 从MongoDB 4.4开始,如果集群中的所有节点都将$out
can run on replica set secondary nodes if all the nodes in cluster have featureCompatibilityVersion set to 4.4
or higher and the Read Preference is set to secondary.featureCompatibilityVersion
设置为4.4
或更高,并且读取首选项设置为secondary,则$out
可以在副本集辅助节点上运行。
Read operations of the $out
statement occur on the secondary nodes, while the write operations occur only on the primary nodes.$out
语句的读操作发生在辅助节点上,而写操作仅发生在主节点上。
Not all driver versions support targeting of 并非所有驱动程序版本都支持将$out
operations to replica set secondary nodes. $out
操作定位到副本集辅助节点。Check your driver documentation to see when your driver added support for 请查看驱动程序文档,了解驱动程序何时添加了对辅助系统上运行的$out
running on a secondary.$out
的支持。
The $out
operation creates a new collection if one does not already exist.$out
操作将创建一个新集合(如果不存在)。
The collection is not visible until the aggregation completes. 在聚合完成之前,集合不可见。If the aggregation fails, MongoDB does not create the collection.如果聚合失败,MongoDB不会创建集合。
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. $out
操作指定的集合已经存在,则在聚合完成后,$out
阶段将用新的结果集合自动替换现有集合。Specifically, the 具体而言,$out
operation:$out
操作:
renameCollection
command with dropTarget: true
to rename the temp collection to the destination collection.dropTarget:true
调用renameCollection
命令,将临时集合重命名为目标集合。The $out
operation does not change any indexes that existed on the previous collection. $out
操作不会更改先前集合中存在的任何索引。If the aggregation fails, the 如果聚合失败,$out
operation makes no changes to the pre-existing collection.$out
操作不会对预先存在的集合进行任何更改。
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._id
字段上的索引,则管道将无法完成。
If the 如果$out
operation modifies a collection with an Atlas Search index, you must delete and re-create the search index. $out
操作使用Atlas搜索索引修改集合,则必须删除并重新创建搜索索引。Consider using 考虑改用$merge
instead.$merge
。
majority
Starting in MongoDB 4.2, you can specify read concern level 从MongoDB 4.2开始,您可以为包含"majority"
for an aggregation that includes an $out
stage.$out
阶段的聚合指定读关注级别"majority"
。
In MongoDB 4.0 and earlier, you cannot include the 在MongoDB 4.0及更早版本中,您不能包含$out
stage to use "majority"
read concern for the aggregation.$out
阶段来使用聚合的"majority"
读取关注点。
mongodump
mongodump
的交互A 如果客户端在转储过程中发出包含mongodump
started with --oplog
fails if a client issues an aggregation pipeline that includes $out
during the dump process. $out
的聚合管道,则以--oplog
启动的mongodump
将失败。See 有关更多信息,请参阅mongodump --oplog
for more information.mongodump --oplog
。
$out inside transactions.$out 。
| |
$out to output to a time series collection.$out 输出到时间序列集合。
| |
$out stage is not allowed as part of a view definition. $out 阶段不允许作为视图定义的一部分。$lookup or $facet stage), this $out stage restriction applies to the nested pipelines as well.$lookup 或$facet 阶段),则$out 阶段限制也适用于嵌套管道。
| |
$lookup | $out stage in the $lookup stage's nested pipeline.$out 阶段包含在$lookup 阶段的嵌套管道中。
|
$facet | $facet stage's nested pipeline cannot include the $out stage.$facet 阶段的嵌套管道不能包含$out 阶段。
|
$unionWith | $unionWith stage's nested pipeline cannot include the $out stage.$unionWith 阶段的嵌套管道不能包含$out 阶段。 |
"linearizable" |
|
In the 在test
database, create a collection books
with the following documents:test
数据库中,创建包含以下文档的books
集合:
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 } ])
If the 如果test
database does not already exist, the insert operation creates the database as well as the books
collection.test
数据库不存在,插入操作将创建数据库和books
集合。
The following aggregation operation pivots the data in the 下面的聚合操作将books
collection in the test
database to have titles grouped by authors and then writes the results to the authors
collection, also in the test
database.test
数据库中books
集合中的数据旋转,使其具有按作者分组的标题,然后将结果写入test
数据库中的authors
集合。
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : "authors" } ] )
$group
):The $group
stage groups by the authors
and uses $push
to add the titles to a books
array field:$group
阶段按authors
分组,并使用$push
将标题添加到books
数组字段:
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
$out
):$out
stage outputs the documents to the authors
collection in the test
database.$out
阶段将文档输出到test
数据库中的authors
集合。To view the documents in the output collection, run the following operation:要查看输出集合中的文档,请运行以下操作:
db.getSiblingDB("test").authors.find()
The collection contains the following documents:该集合包含以下文档:
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
For a replica set or a standalone, if the output database does not exist, 对于副本集或独立数据库,如果输出数据库不存在,$out
also creates the database$out
也会创建数据库.
For a sharded cluster, the specified output database must already exist.对于分片集群,指定的输出数据库必须已经存在。
Starting in MongoDB 4.4, 从MongoDB 4.4开始,$out
can output to a collection in a database different from where the aggregation is run.$out
可以输出到与运行聚合的数据库不同的数据库中的集合。
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 in the reporting
database:books
集合中的数据进行数据透视,使其具有按authors
分组的标题,然后将结果写入reporting
数据库中的作者集合:
db.getSiblingDB("test").books.aggregate( [ { $group : { _id : "$author", books: { $push: "$title" } } }, { $out : { db: "reporting", coll: "authors" } } ] )
$group
):The $group
stage groups by the authors
and uses $push
to add the titles to a books
array field:$group
阶段按authors
分组,并使用$push
将标题添加到books
数组字段:
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] } { "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
$out
):$out
stage outputs the documents to the authors
collection in the reporting
database.$out
阶段将文档输出到reporting
数据库中的authors
集合。To view the documents in the output collection, run the following operation:要查看输出集合中的文档,请运行以下操作:
db.getSiblingDB("reporting").authors.find()
The collection contains the following documents:该集合包含以下文档:
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] } { "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }