$out(聚合)

在本页面

  • 定义

  • 行为

version 2.6 中的新内容。

定义

  • $out

    • 获取聚合管道返回的文档并将它们写入指定的集合。 $out operator 必须是管道中的最后一个阶段。

更改 version 3.2.0:MongoDB 3.2 添加了对文件验证的支持。 bypassDocumentValidation字段使您可以在聚合操作的$out阶段绕过文档验证。这使您可以插入不符合验证要求的文档。在聚合方法或命令中指定bypassDocumentValidation作为选项。

$out阶段具有以下原型形式:

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

$out采用 string 指定输出集合 name。

重要

  • 您不能将分片集合指定为输出集合。管道的输入集合可以分片。

  • $out operator 无法将结果写入上限集合。

行为

创建新集合

$out操作在当前数据库中创建一个新集合(如果尚不存在)。在聚合完成之前,集合不可见。如果聚合失败,MongoDB 不会创建集合。

替换现有集合

如果$out操作指定的集合已存在,则在聚合完成后,$out阶段将使用新结果集合原子替换现有集合。具体来说,$out操作:

  • 创建临时集合。

  • 将索引从现有集合复制到临时集合。

  • 将文档插入临时集合中。

  • Calls db.collection.renameCollection with dropTarget: true将 temp 集合重命名为目标集合。

$out操作不会更改先前集合中存在的任何索引。如果聚合失败,则$out操作不会对 pre-existing 集合进行任何更改。

索引约束

如果管道生成的文档违反任何唯一索引(包括原始输出集合的_id字段上的索引),则管道将无法完成。

集合books包含以下文档:

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

以下聚合操作将books集合中的数据转向以使作者按标题分组,然后将结果写入authors集合。

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

操作完成后,authors集合包含以下文档:

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