当前位置: 首页 > article >正文

MongoDB 聚合管道的输出结果到集合($out)及合并结果到集合($merge)

上一篇文章,我们介绍了使用聚合管道完成文档之间的关联查询、以及如果将两个管道中的文档进行合并,如果需要进一步了解可以参考:
MongoDB 聚合管道的文档关联查询($lookup)及管道合并($unionWith)icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/130076038同样,之前的几篇文章,我们对聚合管道中的管道参数也进行了详细介绍,主要包括了:

        $match:文档过滤

        $group:文档分组,并介绍了分组中的常用操作:$addToSet,$avg,$sum,$min,$max等。

        $addFields:添加字段,等效于$set

        $unset:移除字段

        $project:字段投影

        $sort:文档排序

        $skip:跳过N条文档

        $limit:获取N条文档

        $sample:随机抽取N条文档

        $unwind:分解文档

如果需要进一步了解可以参考:

MongoDB 聚合管道的文档筛选($match)及分组统计($group)icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/130034658MongoDB 聚合管道的字段投影($addFields,$set,$unset,$project)icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/130055110MongoDB 聚合管道的文档操作($sort,$skip,$limit,$sample,$unwind)icon-default.png?t=N3I4https://blog.csdn.net/m1729339749/article/details/130066663本篇我们介绍聚合查询的结果输出与合并到集合中:

一、准备工作

初始化零食数据

db.snacks.insertMany([
    { "_id": 1,  name: "薯片" },
    { "_id": 2,  name: "牛肉干" },
    { "_id": 3,  name: "可口可乐" },
    { "_id": 4,  name: "旺仔牛奶" }
])

初始化人员数据 

db.persons.insertMany([
    { "_id": 3,  name: "张三" },
    { "_id": 4,  name: "李四" },
    { "_id": 5,  name: "王五" },
    { "_id": 6,  name: "赵六" }
])

二、输出结果到集合($out)

语法1:{ $out: { db: "<output-db>", coll: "<output-collection>" } }

        输出结果到指定库的集合

        db: "<output-db>":代表的是要输出到的数据库

        coll: "<output-collection>":代表的是要输出到的集合

语法2: { $out: "<output-collection>" } 

        输出结果到当前库的集合

        coll: "<output-collection>":代表的是要输出到的集合

例子:输出零食到test数据库的data集合

db.snacks.aggregate([
    {
        $out: { db: "test", coll: "data" }
    }
])

执行完聚合操作之后,查询test库中的data集合:

{ "_id" : 1, "name" : "薯片" }
{ "_id" : 2, "name" : "牛肉干" }
{ "_id" : 3, "name" : "可口可乐" }
{ "_id" : 4, "name" : "旺仔牛奶" }

发现聚合查询的结果输出到了新的集合中;

例子:输出人员到test数据库的data集合

db.persons.aggregate([
    {
        $out: { db: "test", coll: "data" }
    }
])

执行完聚合操作之后,查询test库中的data集合: 

{ "_id" : 3, "name" : "张三" }
{ "_id" : 4, "name" : "李四" }
{ "_id" : 5, "name" : "王五" }
{ "_id" : 6, "name" : "赵六" }

发现聚合查询的结果输出到集合之后,原有的数据被清空。

1、$out 输出结果到集合中时,如果数据库或者集合不存在则会新建

2、$out 输出结果到集合中时,会把原有集合中的数据清空

 例子:输出人员到当前数据库的data集合

db.persons.aggregate([
    {
        $out: "data"
    }
])

执行完聚合操作之后,查询当前库中的data集合: 

{ "_id" : 3, "name" : "张三" }
{ "_id" : 4, "name" : "李四" }
{ "_id" : 5, "name" : "王五" }
{ "_id" : 6, "name" : "赵六" }

需要注意的是,$out 只能在4.4及以后的版本中使用

三、合并结果到集合($merge)

语法: 

{ $merge: {
     into: <collection> -or- { db: <db>, coll: <collection> },
     on: <identifier field> -or- [ <identifier field1>, ...],  // Optional
     let: <variables>,                                         // Optional
     whenMatched: <replace|keepExisting|merge|fail|pipeline>,  // Optional
     whenNotMatched: <insert|discard|fail>                     // Optional
} }

其中,

        into:代表的是要合并到的集合;可以是当前库中的集合,也可以指定库中的集合

        on:可选,代表的是合并时根据哪些字段数据判断数据是否存在;默认使用_id作为判断数据是否存在的字段

        let:可选,用于定义变量

        whenMatched: 可选,代表的是如果合并时数据已存在如何处理,默认使用的是replace替换的方式

        whenNotMatched:可选,代表的时如果合并时数据不存在如何处理,默认使用的是insert插入的方式

 例子:合并零食到当前库中的data集合,并合并人员到当前库中的data集合

db.snacks.aggregate([
    {
        $merge: {
            into: "data"
        }
    }
])

执行后,查询data集合中的数据:

{ "_id" : 1, "name" : "薯片" }
{ "_id" : 2, "name" : "牛肉干" }
{ "_id" : 3, "name" : "可口可乐" }
{ "_id" : 4, "name" : "旺仔牛奶" }

再合并人员到当前库中的data集合

db.persons.aggregate([
    {
        $merge: {
            into: "data"
        }
    }
])

执行后,查询data集合中的数据:

{ "_id" : 1, "name" : "薯片" }
{ "_id" : 2, "name" : "牛肉干" }
{ "_id" : 3, "name" : "张三" }
{ "_id" : 4, "name" : "李四" }
{ "_id" : 5, "name" : "王五" }
{ "_id" : 6, "name" : "赵六" }

根据结果可以看出编号3、4的name发生了变化,说明数据存在时使用的是替换的方式;编号5、6是新合并进的数据,说明数据不存在时使用的是插入的方式。

1、$merge 合并结果到集合中时,如果数据库或者集合不存在则会新建

2、$merge 合并结果到集合中时,根据配置的whenMatched对已存在的数据进行操作,根据配置的whenNotMatched对不存在的数据进行操作


http://www.kler.cn/a/15557.html

相关文章:

  • gitlab 服务器集群配置及 存储扩展配置
  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势
  • 从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改
  • Go语言24小时极速学习教程(四)MySQL数据库的增删改查
  • 网络安全SQL初步注入2
  • Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)
  • 什么是redis发布订阅模式,并用java代码实现小demo
  • 我们要被淘汰了?从科技变革看"ChatGPT"与"无代码开发"
  • 【数据库数据恢复】ORACLE常见数据灾难的数据恢复可能性分析
  • 【学习笔记】CF607E Cross Sum
  • 前端开发技术——对象
  • apple pencil有买的必要吗?便宜的平替电容笔推荐
  • [学习笔记] [机器学习] 3. KNN( K-近邻算法)及练习案例
  • Springboot +Flowable,详细解释啥叫流程实例(二)
  • 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)
  • QFIELD-GIS工具版如何编辑数据
  • 入职华为外包一个月后,我离职向“北上广深”流浪了...
  • Ubuntu22.04部署Pytorch2.0深度学习环境
  • SQL性能调优简介
  • EPIT定时器实验(一)
  • 区块链学习一(FISCO BCOS部署控制台部署第一个HelloWorld)
  • 射频电路设计常见问题以及经验总结
  • 【MATLAB图像处理实用案例详解(12)】——利用BP神经网络实现图像压缩
  • redis 过期消息订阅实现(java实现)
  • Java数组的学习(基础)
  • [ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南