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

news2024/9/21 16:37:41

上一篇文章,我们介绍了使用聚合管道完成文档之间的关联查询、以及如果将两个管道中的文档进行合并,如果需要进一步了解可以参考:
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.coloradmin.cn/o/467393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES索引管理

ES官方博客&#xff1a;https://elasticstack.blog.csdn.net/?typeblog 一、rolloverAPI https://elasticstack.blog.csdn.net/article/details/102728987 1.1 rollover命令 POST /log_alias/_rollover { "conditions":{ "max_age":"…

Node 09 MongoDB的使用

MongoDB 简介 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 数据库是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的 应用程序 数据库的作用 数据库的主要作用就是 管理…

jsp家庭农场投入品信息管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp家庭农场投入品信息管理系统是一套完善的java web信息管理系统 serlvet dao bean 开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发…

如何理解PCB布线3W规则

我们平时在PCB布线的时候&#xff0c;对于比较重要的信号都要做特殊处理&#xff0c;比如包地或者时“3W”&#xff0c;所谓3w指的是线与线之间的间距要满足三倍的线宽&#xff0c;那么我们怎么理解这个3W原则呢&#xff0c;他是如何降低信号之间的串扰的呢&#xff1f; 我们要…

连网介质及设备详解

文章目录 一、网卡1. 有线网卡2. 无线网卡3. 光纤网卡 二、网线1. 双绞线2. 光缆 三、交换机1. 什么是交换机2. 交换机分类 一、网卡 网卡分为三类&#xff1a;有线网卡、无线网卡、光纤网卡 1. 有线网卡 多数台式计算机自带&#xff0c;采用 RJ-45 制式接口 通过双绞线传输…

Hive2安装Tez计算引擎

一、Tez介绍 ApacheTEZ项目旨在构建一个应用程序框架&#xff0c;该框架允许使用复杂的有向无环图来处理数据。 它当前构建在Apache Hadoop YARN之上。 Tez的2个主要设计主题是&#xff1a; 通过以下方式增强最终用户的能力&#xff1a; 富有表现力的数据流定义API 灵活的输入…

ICV:车载毫米波雷达中国市场有望在2025年实现30亿美元的市场规模

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了全球车载毫米波雷达的市场研究报告&#xff0c;汽车毫米波&#xff08;mmWave&#xff09;雷达基于频率为77 GHz的电磁波&#xff0c;具有高精度和准确性&#xff0c;可用于目标检测。这种技术有着广泛的应用&#x…

Dubbo面试大全

Dubbo面试题 1.Dubbo 是什么&#xff1f; Dubbo是阿里巴巴开源的分布式&#xff0c;高性能的透明化的RPC服务框架&#xff0c;提供服务自动注册&#xff0c;自动发现等高效服务治理方案&#xff0c;可以和Spring框架可以无缝衔接。 2.Dubbo的由来 你们的项目为什么会使用Du…

论文阅读 关联规则挖掘综述

这是一篇关联规则挖掘的综述&#xff0c;也记录下自己的心得笔记 A comprehensive review of visualization methods for association rule mining: Taxonomy, Challenges, Open problems and Future ideas 文章目录 摘要1、介绍2、关联规则挖掘是个小东西2.1、数值关联规则挖…

AGI智能新时代,技术驱动营销数字化重组|数说故事D3峰会盛况

万物向新&#xff0c;数字重组。 3月29日&#xff0c;以「REMIX——重组数字未来&#xff0c;创享无限可能」为主题的数说故事第六届D3智能营销峰会在广州白云国际会议中心圆满举办。本届峰会由数说故事携手GDMS联合主办&#xff0c;数说故事作为专场合作伙伴&#xff0c;与50…

php通过cURL爬取数据的方法(ajax接口、cookie伪造爬取、文件头信息)

php通过curl爬取数据 一、请求流程1.CURL请求步骤2.使用CURL发送GET请求3.使用CURL发送POST请求 二、实战&#xff1a;curl通过ajax接口API爬取数据1.接口分析2.抓取分析3.构建curl4.结果呈现 三、实战&#xff1a;curl添加cookie伪造登陆爬取数据1.注册用户&#xff0c;并记录…

【老王读SpringMVC-4】请求参数是如何绑定到Controller method参数对象上的?

前面我们分析了&#xff0c;如果我们自己要实现 spring mvc 框架的话&#xff0c;大致需要实现如下功能&#xff1a; 0、将 url 与 Controller method 的对应关系进行注册1、通过请求的 url 找到 Controller method (即 url 与 Controller method 的映射)2、将请求参数进行绑定…

FPGA时序约束(四)主时钟和虚拟时钟的约束

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 FPGA时序约束&#xff08;三&#xff09;时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…

计算机网络【2】 子网掩码

学习大佬记下的笔记 https://zhuanlan.zhihu.com/p/163119376 "子网"掩码&#xff0c;顾名思义&#xff0c;它就是拿来划分子网的&#xff0c;更准确的说&#xff0c;划分子网的同时&#xff0c;还能通过它知道主机在子网里面的具体ip的具体地址。 子网掩码只有一个…

聊聊「低代码」的实践之路

区块链、低代码、元宇宙、AI智能&#xff1b; 01 【先来说说背景】 这个概念由来已久&#xff0c;但是在国内兴起&#xff0c;是最近几年&#xff1b; 低代码即「Low-Code」&#xff1b; 指提供可视化开发环境&#xff0c;可以用来创建和管理软件应用&#xff1b; 简单的说…

中英文切换,vue项目国际化使用教程(国际化使用详细,i18n国际化)

简述&#xff1a;在工作中&#xff0c;我们难免会遇到把文字切换成外语的需求&#xff0c;这里来记录下如何在项目中点击切换成英语&#xff0c;这里会用到i18n&#xff0c;它是一个支持国际化功能的插件&#xff0c;这里来分享下它的使用过程。 1、首先&#xff0c;我们需要在…

idea使用 ( 四 ) 插件

5.插件 5.1.idea数据库连接 5.1.1.打开配置界面 5.1.2.选择MySQL 点击 号 > Data Source > MySQL 5.1.3.配置数据库驱动jar 先在左边选择 MySQL 再点击 号 > Custom JARs… 在 弹出的窗口中选择 已经存在的 jar位置 就导入 MySQL 的驱动文件 5.1.4.配置连库…

记录一次在x86 软件中使用dpdk 的历程(Makefile gcc改成g++)

我们一台服务器上原本是用grub下预留内存的方式, 然后把物理地址在板卡上的配置文件中传给L1. 但是在客户的环境上服务器windriver上不是能预留内存的. 所以服务器上需要在testMxx程序中用dpdk的方式分配出内存, 然后, 把物理地址通过sdp虚拟的网口&#xff0c; 用socket 传…

为什么要清除浮动?清除浮动的方式

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 浮动的定义浮动的工作原理浮动的特性为什么要清除浮动清除浮动的方式利用clear样式…

vue3 vite typescript volar element-plus element标签报红问题的解决

故障就这样的&#xff1a; 模块 ""element-plus"" 没有导出的成员 "FormInstance" 至于原因咱也不知道&#xff0c;也没搞明白&#xff0c;一直以为是volar校验的问题&#xff0c;能开发咱就接着干&#xff0c;到了发布的时候傻眼了。所有这种…