在上一篇?mongodb Aggregation聚合操作之$replaceRoo中詳細(xì)介紹了mongodb聚合操作中的$replaceRoot使用以及參數(shù)細(xì)節(jié)。本篇將開始介紹Aggregation聚合操作中的$out操作。
說明:
獲取聚合管道返回的文檔,并將其寫入指定的集合。$out操作符必須是管道中的最后一個(gè)階段。
版本3.2.0中的變化:MongoDB 3.2增加了對文檔驗(yàn)證的支持。bypassDocumentValidation字段允許您在聚合操作的$out階段繞過文檔驗(yàn)證。這允許插入不滿足驗(yàn)證要求的文檔。將bypassDocumentValidation指定為聚合方法或命令的選項(xiàng)。
語法:
{ $out: "<output-collection>" }
注意:不能將分片集合指定為輸出集合??梢詫艿赖妮斎爰线M(jìn)行切分。$out操作符不能將結(jié)果寫入有上限的集合。如果當(dāng)前數(shù)據(jù)庫中還不存在一個(gè)集合,則$out操作將在該數(shù)據(jù)庫中創(chuàng)建一個(gè)新的集合。在聚合完成之前,集合是不可見的。如果聚合失敗,MongoDB不會(huì)創(chuàng)建集合。如果$out操作指定的集合已經(jīng)存在,則在完成聚合后,$out stage將自動(dòng)用新的結(jié)果集合替換現(xiàn)有集合,具體步驟分為以下四步:
1.創(chuàng)建一個(gè)臨時(shí)集合。
2.將索引從現(xiàn)有集合復(fù)制到臨時(shí)集合。
3.將文檔插入到臨時(shí)集合中。
4.調(diào)用db.collection.renameCollection使用dropTarget的renameCollection: true將臨時(shí)集合重命名為目標(biāo)集合。
$out操作不會(huì)更改前一個(gè)集合上存在的任何索引。如果聚合失敗,則$out操作不會(huì)對預(yù)先存在的集合進(jìn)行更改。指數(shù)的約束如果管道生成的文檔違反了任何唯一索引(包括原始輸出集合的_id字段上的索引),則管道將無法完成。
1.?示例
初始化數(shù)據(jù):
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 }])
示例:根據(jù)author字段分組后,把結(jié)果寫到authors集合中
db.outExample.aggregate( [
??????????????????????{ $group : { _id : "$author", books: { $push: "$title" } } },
??????????????????????{ $out : "authors" }
??????????????????] )
查看authors集合獲得結(jié)果:
{
????"_id" : "Homer",
????"books" : [
????????"The Odyssey",
????????"Iliad"
????]
}
{
????"_id" : "Dante",
????"books" : [
????????"The Banquet",
????????"Divine Comedy",
????????"Eclogues"
????]
}