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 唐剑、百度智能云应…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
