mongodb基础操作

mongodb Aggregation聚合操作之$out

2021-03-14  本文已影响0人  蚁族的乐土

在上一篇 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"

    ]

}

上一篇下一篇

猜你喜欢

热点阅读