MongoDB Shell 基本命令(三)聚合管道
-
管道含义
类似Linux中的管道,前一个命令的输出作为后一个命令的输入。
-
显示网络连接、路由表和网络接口统计信息
netstat -ano
-netstat:network statistics 网络统计
-a:显示所有连接和监听端口,包括所有活动的TCP和UDP连接。
-n:以数字形式显示地址和端口号,而不是尝试解析为主机名和服务名称。
-o:显示与每个连接关联的进程ID(PID),这使得用户可以知道哪个进程正在使用特定的网络连接。
加上管道,查看与某个特定端口(27017)相关的连接,findstr相当于Linux中的grep,用于查找字符串的命令行工具。
netstat -ano | findstr :27017
“ESTABLISHED” 是 TCP 协议的一种状态,表示一条 TCP连接已经成功建立,并且可以开始数据通信。
加上管道,只查看LISTENING相关连接
netstat -ano | findstr :27017 | findstr :27017 | findstr LISTENING
所以,管道的含义就是:前一个命令的结果,作为后续命令的输入。我们可以在前面查询的基础上,整理过后,再进行查询。
select count(*) from tabname where ...;
select sum() from tabname group by ...;先分组再统计,相当于是多步操作
- count()和distinct()
use cqust;
//如果查询条件为空,查询文档记录数
db.students.count();//集合的文档总数//统计女生/男生的数量
var 查询条件={gender:0};
db.students.count(查询条件);//第二种写法
db.students.find(查询条件).count()//count(查询条件)等价于find(查询条件).count()//select distinct major from tbname
//distinct,获取不重复的取值
//查询2022级有哪些专业
var 查询条件={grade:2022};
var 返回字段={_id:0,major:1,grde:1};
db.students.find(查询条件,返回字段);//有重复值//格式:db.students.distinct(取值字段,查询条件)
db.students.distinct("major",查询条件);//返回数组//2022级学生上了哪些课程
db.students.distinct("courses.course",{grade:2022});//一共有哪些课程
db.students.distinct("courses.course");
- 聚合管道
- 聚合是数据处理和分析的过程,对来自多个文档的数据进行计算、总结和分析,强调数据的汇总和计算。
- 管道是一个结构,通过多个处理阶段(每个阶段可以执行不同类型的操作)来实现聚合的过程。
- 分组操作用到聚合管道。
- $match:过滤输入文档,只有满足指定条件的文档会被传递到管道的下一个阶段。where(sql)
- $group:将输入文档分组,并按指定的键对每个组编制汇总。可以计算总和、平均值等。
- $sort:对输入文档进行排序。1、0升序和降序;
- $project:重塑输入文档,选择需要的字段并可以添加计算字段。(字段名修改、增加字段)
- limit和skip:用于限制返回的结果数量或跳过指定数量的文档。
第一阶段:$match
阶段按status
字段过滤文档,并将status
等于"A"
的文档传递到下一阶段。
第二阶段:$group
阶段按cust_id
字段将文档分组,以计算每个cust_id
唯一值的金额总和。
$match
的含义- 功能: $match
阶段用于过滤集合中的文档,以保留所有符合指定条件的文档。它的作用类似于 SQL 中的 WHERE
子句。
- 聚合管道格式
db.orders.aggregate([{ $match: { status: "A" } },{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
//var 步骤1={步骤操作符:操作文档}
//var 步骤数组=[步骤1,步骤2,步骤3,...]
//db.集合名.aggregate(步骤数组)
{$group:{_id:分组字段,聚合字段:{$统计操作:$值字段}}}
{$project:{field1:1,newfield2:$oldfield2}}
{$sort:{field1:1,field2:-1}}
{$limit},{$skip}
{$unwind:"$listfield"} 将数组中的元素分配到多行(拉平数组)
- 筛选出选择分布式数据库原理与应用的学生信息
var 步骤1 = {$match:{"courses.course":"分布式数据库原理与应用"}};
var 步骤1 = {$match:{"courses.course":/分布式/}};//正则表达式,匹配包含”分布式“
var 步骤数组 = [步骤1];
db.students.aggregate(步骤数组);
- 统计男女生人数 0女生 1男生
//select count(*) as 人数,gender from students group by gender
//group操作符,取值进行group by
var 步骤1 = {$group:{_id:"$gender",人数:{$sum:1}}};
var 步骤数组 = [步骤1];
db.students.aggregate(步骤数组);
- 为了让刚才的结果更直观,用到project ,这个阶段在数据处理过程中起到了选择、重命名和计算字段的重要作用。
var 步骤1 = {$group:{_id:"$gender",人数:{$sum:1}}};
var 步骤2 = {$project:{性别:"$_id",人数:1,_id:0}};//1表示返回原来的人数
var 步骤数组 = [步骤1,步骤2];
db.students.aggregate(步骤数组);
- 统计大数据专业男女生人数
var 步骤0={$match:{"major":"大数据"}};
var 步骤1={$group:{_id:"$gender",人数:{$sum:1}}}//$表示值,sum:1相当于是count
var 步骤2={$project:{性别:"$_id",人数:1,_id:0}}
var 步骤数组=[步骤0,步骤1,步骤2]
db.students.aggregate(步骤数组)
- 统计2022级大数据专业1班男女生人数
//非分组做法,分别统计
db.students.count({major:"大数据",grade:2022,class:1,gender:0});//求出女生人数
db.students.count({major:"大数据",grade:2022,class:1,gender:1});//求出男生人数
//分组做法
var 先找出本班所有学生的记录 ={$match:{major:"大数据",grade:2022,class:1}};
var 计算男女生的数量={$group:{_id:"$gender",人数:{$sum:1}}};//相当于是求了count
db.students.aggregate([先找出本班所有学生的记录,计算男女生的数量]);
- 统计2022级大数据专业1班男女体重和
//db.students.aggregate([{阶段1},{阶段2},{阶段3},...])
//db.students.aggregate([先找出本班所有学生的记录,然后分男女计算体重的和,整理结果]);
//统计2022级大数据专业1班男女体重和
//select sum(bodyweight) as 总体重, gender as 性别
//from tbstudents
//group by gender
//where major="大数据" and grade=2020 and class=1
var 先找出本班所有学生的记录 = {$match:{major:"大数据",grade:2022,class:1}};
var 然后分男女计算体重的和 = {$group:{_id:"$gender",总体重:{$sum:"$body.weight"}}};
var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:"$总体重","单位":"kg"}};
db.students.aggregate([先找出本班所有学生的记录,然后分男女计算体重的和,整理结果])
- 加减乘除运算符号 a d d 、 add、 add、substract、 m u l t i p l y 、 multiply、 multiply、divide
var 先找出本班所有学生的记录 = {$match:{major:"大数据",grade:2022,class:1}};
//var 然后分男女计算体重的和 ={$group:{_id:分组字段,聚合字段:{$统计操作:$值字段}};
var 然后分男女计算体重的和 = {$group:{_id:"$gender",总体重:{$sum:"$body.weight"}}};
//var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:"$总体重","单位":"kg"}};
//var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:{$add:["$总体重",1000]},"单位":"kg"}};//通过$add增加1000
//var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:{$subtract:["$总体重",2000]},"单位":"kg"}};//通过$add减少2000
var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:{$multiply:["$总体重",2]},"单位":"kg"}};//通过$add减少2000
//var 整理结果 = {$project:{_id:0,"性别":"$_id",总体重:{$divide:["$总体重",1000]},"单位":"t"}};//通过$divide将体重从kg转换为吨
db.students.aggregate([先找出本班所有学生的记录,然后分男女计算体重的和,整理结果]);
- 统计各科课程的平均分
// "courses": [
// {
// "course": "结构化数据存储与应用",
// "credit": 2,
// "score": 67
// }
// ]//var 分组统计 = {$group:{_id:分组字段,聚合字段:{$统计操作:$值字段}}}
var 分组统计 = {$group:{_id:"$courses.course",平均分:{$avg:"$courses.score"}}};
db.students.aggregate([分组统计]);//直接这样查询有问题,对于数组\数组字段,无法直接分组统计
二维------>一维(unwind) ;
{ u n w i n d : " unwind:" unwind:"listfield"} 将列表中的元素分配到多行(拉平数组)
正确写法
//需要先将数组拉平,也就是说将数组中的值拆出来与其他字段连接
// {A,B:[1,2]} => {A,B:1} {A,B:2}
var 平摊数组 = {$unwind:"$courses"};
var 分组统计 = {$group:{_id:"$courses.course", 平均分:{$avg:"$courses.score"}}};
//db.students.aggregate([平摊数组]);//此时可以看出,数组已经被拉开了
db.students.aggregate([平摊数组,分组统计]);
- 在上一步基础上,利用 s o r t 和 sort和 sort和limit返回前3结果
var 平摊数组 = {$unwind:"$courses"};
var 分组统计 = {$group:{_id:"$courses.course", 平均分:{$avg:"$courses.score"}}};
var 排序 = {$sort:{平均分:-1}};
var 返回前3结果 = { $limit : 3 }
db.students.aggregate([平摊数组,分组统计,排序,返回前3结果]);
- 在上一步基础上,统计平均分大于74.5分的课程
//select avg(score) 平均分,course from tbstudents group by course having 平均分>=74.5
var 平摊数组 = {$unwind:"$courses"};
var 分组统计 = {$group:{_id:"$courses.course", 平均分:{$avg:"$courses.score"}}};
var 结果筛选 = {$match:{"平均分":{$gte:74.5}}}
db.students.aggregate([平摊数组,分组统计,结果筛选])// 方法用于在集合上执行一系列的聚合操作。
- 统计分布式数据库原理与应用的平均分
var 平摊数组 = {$unwind:"$courses"};
var 分组统计 = {$group:{_id:"$courses.course", 平均分:{$avg:"$courses.score"}}};
var 结果筛选 = {$match:{"_id":/分布式/}}//非courses.course中,$match 是一个筛选操作符,用于过滤文档
//使用了正则表达式来匹配 _id 字段包含“分布式”字符串的文档。
var 整理结果 = {$project:{"course":"$_id","avgscore":{$round:["$平均分",2]},_id:0}}//$project 用于选择和重命名文档中的字段。指定将 _id 字段重命名为 course,平均分 字段重命名为 avgscore,并且排除 _id 字段在输出结果中显示(_id: 0 表示不显示 _id 字段)。{$round:["$平均分",2]}四舍五入,保留两位小数
db.students.aggregate([平摊数组,分组统计,结果筛选,整理结果])
- 统计分布式数据库课程的平均分,要求保留两位小数
//统计分布式数据库课程的平均分,要求保留两位小数
var 平摊数组 = {$unwind:"$courses"};
var 分组统计 = {$group:{_id:"$courses.course", 平均分:{$avg:"$courses.score"}}};
var 整理结果 = {$project:{"course":"$_id","avgscore":{$round:["$平均分",2]},_id:0}}//$project 用于选择和重命名文档中的字段。指定将 _id 字段重命名为 course,平均分 字段重命名为 avgscore,并且排除 _id 字段在输出结果中显示(_id: 0 表示不显示 _id 字段)。{$round:["$平均分",2]}四舍五入,保留两位小数
db.students.aggregate([平摊数组,分组统计,结果筛选,整理结果])
- 统计各班级(专业\年级\班级)分布式数据库课程的平均分
//方法一:直接连接
var 拉平数组 = {$unwind:"$courses"};
var 查找课程 = {$match:{"courses.course":/分布式/}};
//_id是一个组合字段,包括专业、年级、班级信息
var 按班级统计平均分 = {$group:{_id:{专业:"$major",年级:"$grade",班级:"$class"},平均分:{$avg:"$courses.score"}}}
var 整理结果 = {$project:{专业:"$_id.专业",年级:"$_id.年级",班级:"$_id.班级",平均分:{$round:["$平均分",2]},_id:0}};
db.students.aggregate([拉平数组,查找课程,按班级统计平均分,整理结果]);//方法二:利用$concat连接,$tostring强制转换
var 拉平数组 = {$unwind:"$courses"};
var 查找课程 = {$match:{"courses.course":/分布式/}};
//_id是一个组合字段,包括专业、年级、班级信息
var 按班级统计平均分 = {$group:{_id:{"行政班级":{$concat:["$major",{$toString:"$grade"},"-0",{$toString:"$class"}]}},平均分:{$avg:"$courses.score"}}};
var 整理结果 = {$project:{"行政班级":"$_id.行政班级",平均分:{$round:["$平均分",2]},_id:0}};
var 排序 = {$sort:{"行政班级":1}};//按照行政班级升序
db.students.aggregate([拉平数组,查找课程,按班级统计平均分,整理结果,排序]);
- 按专业求女生平均身高低于170的专业,并排序($sort)
/*
SQL: select AVG(height) as avgHeight, major as _id from students where gender=0group by majorhaving avgHeight<=170sorted by avgHeight DESC
*/
db.getCollection("students").aggregate([//第一步,查数据{$match:{gender:0}}//第二步,限制返回字段,{$project:{_id:0,major:1, grade:1, class:1, height:"$body.height"}}//第三步,分组求平均值// _id: group by的字段, 字段名要加$符号前缀,表示是一个字段名// avgHeight: 新生成的平均值字段名// $avg: 平均值操作符,它的值为要求平均值的字段名,注意加$前缀,{$group:{_id:"$major", avgHeight:{$avg:"$height"}}}//第四步,筛选聚合结果,{$match:{avgHeight:{$lte:170}}}//第五步,排序,按照avgHeight的值从大到小排序, -1: DESC, 1:ASC,{$sort:{avgHeight:-1}}//,{$limit:1} //取结果中最接近170的值
])
- 课堂练习
1.统计各课程的平均分,并返回倒数第一名的结果
2.统计本专业分布式数据库课程的平均分,并且保留两位小数
相关文章:

MongoDB Shell 基本命令(三)聚合管道
管道含义 类似Linux中的管道,前一个命令的输出作为后一个命令的输入。 显示网络连接、路由表和网络接口统计信息 netstat -ano -netstat:network statistics 网络统计 -a:显示所有连接和监听端口,包括所有活动的TCP和UDP连接。 -n:以数字形式显示地址…...

Go语言的内置容器
文章目录 一、数组数组的定义数组声明数组特点数组元素修改 二、切片切片声明基于数组创建切片使用make()函数构造切片使用append()为切片动态添加元素\使用copy()复制新的切片数组与切片相互转换 三、Map映射Map定义使用make()函数创建map用切片作为map的值使用delete()函数删…...

HCIP考试怎样预约?随时可以考试吗?
HCIP(华为认证互联网协议专家)的考试并不是随时都能参加的,考生需要避开法定节假日来预约考试。具体的考试时间会根据所选的认证方向和考试中心有所变化。考生可以通过华为人才在线平台或者直接联系Pearson VUE来安排考试时间。 HCIP认证考试…...

香港航空 阿里滑块 acw_sc__v3 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...

JS传统函数中常见的 this 绑定问题
在 JavaScript 中,传统函数的 this 绑定规则依赖于函数的调用方式,这常常导致一些意外的行为和常见的 this 绑定问题。以下是一些典型的 this 绑定问题及其解决方案。 1. 作为对象方法调用时的 this 丢失 当一个对象的方法被赋值给一个变量或作为回调函…...

跨域问题以及使用vscode的LiveServer插件跨域访问
目录 现象跨域问题的定义(文心一言)解决办法同源部署后端代理VS Code LiveServer 现象 以下前端代码部署后,在网页访问时报错:No ‘Access-Control-Allow-Origin’ header is present on the requested resource. $.ajax({url:…...

现代Web开发:WebSocket 实时通信详解
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 现代Web开发:WebSocket 实时通信详解 现代Web开发:WebSocket 实时通信详解 现代Web开发:WebS…...

《深度学习》——深度学习基础知识(全连接神经网络)
文章目录 1.神经网络简介2.什么是神经网络3.神经元是如何工作的3.1激活函数3.2参数的初始化3.2.1随机初始化3.2.2标准初始化3.2.3Xavier初始化(tf.keras中默认使用的)3.2.4He初始化 4.神经网络的搭建4.1通过Sequential构建神经网络4.2通过Functional API…...

nginx 部署2个相同的vue
起因: 最近遇到一个问题,在前端用nginx 部署 vue, 发现如果前端有改动,如果不适用热更新,而是直接复制项目过去,会404 因此想到用nginx 负载两套相同vue项目,然后一个个复制vue项目就可以了。…...

利用Java easyExcel库实现高效Excel数据处理
在Java应用程序中,处理Excel文件是一项常见任务,尤其是在需要读取、写入或分析大量数据时。easyExcel是一个基于Java的高性能Excel处理库,它提供了简洁的API和优化的性能,以简化Excel文件的处理。本文将指导您如何使用easyExcel库…...

Vulnhub靶场 Metasploitable: 1 练习(上)
目录 0x00 准备0x01 主机信息收集0x02 Samba服务(CVE-2007-2447)0x03 Distccd(CVE-2004-2687)0x04 Mysql弱口令0x05 Postgresql弱口令0x06 Telnet弱口令0x07 Tomcat 0x00 准备 下载链接:https://download.vulnhub.com/…...

《Python编程实训快速上手》第二天--列表与元组
一、列表 1、理解 列表是一个值,包含由多个值构成的序列 2、元素查找 1)索引--取列表中的单个值 正数索引:同c语言中的数组 spam [[1,2,3,4],["cat","dog"]] print(spam[0][1]) #结果:2 负数索引&…...

jangow靶机
先改jangow的ip设置,无ip地址,重启jangow虚拟机时候快速按E这个键盘,进入到编辑模式,找到ro这个位置,写入ro rw signin init/bin/bash ,ctrlx保存 下一步需要更改网卡名字为ens33,可以直接…...

使用UDP协议传输视频流!(分片、缓存)
背景 最近在开发工作中遇到需要两台本地设备之间进行视频流的传输的情况。但是团队一来没有这方面的专业人才,二来视频流的传续数据量很大,针对TCP和UDP的具体选择也不明确。 本文是在上诉背景之下进行的研究和开发工作。 目录 背景 UDP和TCP协议的…...

Pinia小菠萝(状态管理器)
Pinia 是一个专为 Vue 3 设计的状态管理库,它借鉴了 Vuex 的一些概念,但更加轻量灵活。下面将详细介绍如何使用 Pinia 状态管理库: 安装 Pinia 使用 npm:在项目目录下运行npm install pinia。使用 yarn:在项目目录下运…...

Python知识点:基于Python工具,如何使用Web3.py进行以太坊智能合约开发
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 基于Python工具Web3.py进行以太坊智能合约开发 简介 智能合约是区块链技术的核…...

【简信CRM-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

ssm+vue694基于Java的药店药品信息管理系统的设计与实现
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...

Sentinel微服务保护
目录 雪崩问题 解决雪崩问题的方法: 我们使用sentinel组件实现微服务的保护 一:下载sentinel 二.启动sentinel 三.访问:localhost:8080 默认的账号和密码都是sentinel 微服务整合sentinel 一.导入sentinel依赖 二.在application.yml配置…...

喜讯!实在Agent智能体入选《2024年度最佳企业服务AI产品榜》
10 月 30 日,硅星人主办的首届 AI 创造者大会(ACC)于北京中关村盛大举行。此次大会旨在为 AI 产业生态的共建者构筑一个多元化的交流平台。大会邀请了硅星人创始人兼 CEO 骆轶航、国家地方共建具身智能机器人创新中心 CTO 唐剑、百度智能云应…...

Aop+自定义注解实现数据字典映射
数据字典 Web项目开发中,字典表的一般都会存在,主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示,在存储数据和查询数据的时候,就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…...

大语言模型(LLM)入门级选手初学教程 III
指令微调 一、指令数据的构建 包括任务描述(也称为指令)、任务输入-任务输出以及可选的示例。 Self-Instruct 指令数据生成:从任务池中随机选取少量指令数据作为示例,并针对Chat-GPT 设计精细指令来提示模型生成新的微调数据…...

STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入
STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次写入 参考例程例程说明一、存储到Flash中的数据二、Flash最底层操作(解锁,加锁,擦除,读写)三、从Flash块中读取数据五、测试验证 参考例程 STM32G0xx HAL和LL库Flash读写擦除操…...

SAP B1 认证考试习题 - 解析版(三)
前一篇:《SAP B1 认证考试习题 - 解析版(二)》 题目纯享版合集:《SAP B1 认证考试习题 - 纯享版》 五、运费(附加费用) 57. 以下哪个选项能够影响库存商品的价格 A. 仅为总量级别的附加费用 B. 只为行级…...

数据库开发规范
一、概述 本规范规定了,软件项目团队开发数据库的全流程规范。规范覆盖了数据库设计、管理及配套文件等。 二、项目阶段 项目阶段包括需求评审(需求分析阶段)、技术评审(方案阶段)、数据库开发…...

使用python向钉钉群聊发送消息
使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook,将地址复制出来,并记录,后面会用到 二、使用代码发送消…...

YOLOv11改进:SE注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,与其他一些注意力机制相比,不仅准确度更高,而且模型更加轻量化。)
如果实验环境尚未搭建成功,可以参考这篇文章 ->【YOLOv11超详细环境搭建以及模型训练(GPU版本)】 文章链接为:YOLOv11超详细环境搭建以及模型训练(GPU版本)-CSDN博客 -------------------------------…...

STM32 基于HAL库和STM32cubeIDE的应用教程 (二)--GPIO的使用
如果有什么不懂的地方欢迎私聊博主,欢迎小白,博主必一一解答。 在 STM32 中,GPIO(通用输入输出)是与外部硬件接口进行交互的主要方式之一。STM32 HAL 库提供了简洁的接口来配置和控制 GPIO 引脚。下面是使用 STM32 HA…...

【毫米波雷达(七)】自动驾驶汽车中的精准定位——RTK定位技术
一、什么是RTK? RTK,英文全名叫做Real-time kinematic,也就是实时动态。这是一个简称,全称其实应该是RTK(Real-time kinematic,实时动态)载波相位差分技术。 二、RTK的组装 如上图所示&#x…...

Transformer和BERT的区别
Transformer和BERT的区别比较表: 两者的位置编码: 为什么要对位置进行编码? Attention提取特征的时候,可以获取全局每个词对之间的关系,但是并没有显式保留时序信息,或者说位置信息。就算打乱序列中token…...