在上一篇 mongodb Aggregation聚合操作之$replaceRoo中详细介绍了mongodb聚合操作中的$replaceRoot使用以及参数细节。本篇将开始介绍Aggregation聚合操作中的$out操作。
说明:
获取聚合管道返回的文档,并将其写入指定的集合。$out操作符必须是管道中的最后一个阶段。
版本3.2.0中的变化:MongoDB 3.2增加了对文档验证的支持。bypassDocumentValidation字段允许您在聚合操作的$out阶段绕过文档验证。这允许插入不满足验证要求的文档。将bypassDocumentValidation指定为聚合方法或命令的选项。
语法:
{ $out: "<output-collection>" }
注意:不能将分片集合指定为输出集合。可以对管道的输入集合进行切分。$out操作符不能将结果写入有上限的集合。如果当前数据库中还不存在一个集合,则$out操作将在该数据库中创建一个新的集合。在聚合完成之前,集合是不可见的。如果聚合失败,MongoDB不会创建集合。如果$out操作指定的集合已经存在,则在完成聚合后,$out stage将自动用新的结果集合替换现有集合,具体步骤分为以下四步:
1.创建一个临时集合。
2.将索引从现有集合复制到临时集合。
3.将文档插入到临时集合中。
4.调用db.collection.renameCollection使用dropTarget的renameCollection: true将临时集合重命名为目标集合。
$out操作不会更改前一个集合上存在的任何索引。如果聚合失败,则$out操作不会对预先存在的集合进行更改。指数的约束如果管道生成的文档违反了任何唯一索引(包括原始输出集合的_id字段上的索引),则管道将无法完成。
1. 示例
初始化数据:
db.outExample.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 }])
示例:根据author字段分组后,把结果写到authors集合中
db.outExample.aggregate( [
{ $group : { _id : "$author", books: { $push: "$title" } } },
{ $out : "authors" }
] )
查看authors集合获得结果:
{
"_id" : "Homer",
"books" : [
"The Odyssey",
"Iliad"
]
}
{
"_id" : "Dante",
"books" : [
"The Banquet",
"Divine Comedy",
"Eclogues"
]
}
网友评论