On this page
$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" ] }