$out (aggregation)

在本页面

2.6 版的新功能。

Definition

  • $out
    • 获取聚合管道返回的文档,并将其写入指定的集合。 $out运算符必须是管道中的“最后阶段”。

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

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

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

$out采用指定输出集合名称的字符串。

Important

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

  • $out运算符无法将结果写入capped collection

Behaviors

创建新收藏

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

替换现有集合

如果由$out操作指定的集合已经存在,那么在聚合完成后,$out阶段以原子方式将现有集合替换为新的结果集合。具体来说,$out操作:

  • 创建一个临时集合。

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

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

  • dropTarget: true调用db.collection.renameCollection将临时集合重命名为目标集合。

$out操作不会更改上一个集合中存在的任何索引。如果聚合失败,则$out操作不会更改现有集合。

Index Constraints

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

Example

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