Mongodb入门--头歌实验MongoDB 数据库基本操作

MongoDB 中聚合( aggregate )主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果,通常由聚合管道操作符和聚合表达式组合,完成数据处理。功能有点类似 Sql 语句中的 sum()、agv() 等。

一、聚合管道操作符将文档定制格式输出(一)

 任务描述

本关任务:按照编程要求,对集合 educoder 进行相应的查询输出。

相关知识

为了完成本关任务,你需要掌握: 1.聚合管道操作符的作用; 2.$project 的用法; 3.$match 的用法。

常用聚合管道操作符

常用的几个聚合管道操作符:

操作符作用
$project修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
$match用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作
$limit用来限制MongoDB聚合管道返回的文档数
$skip在聚合管道中跳过指定数量的文档,并返回余下的文档
$unwind将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
$group将集合中的文档分组,可用于统计结果
$sort将输入文档排序后输出

注意:以上操作不会修改集合的内容,只是将集合以指定形式输出

在数据库 mydb1 有集合 educoder 内容如下:

_idcourseauthortagslearning_num
1Python表达式问题求解实训李暾Python基础,求解1882
2Java语言之基本语法余跃Java基础,语法814
3Python面向对象编程实训李暾Python基础,面向对象143
4Android综合实训之物联网移动应用开发(1)prophet5Android,物联网,移动开发

$project 修改文档结构输出

有时候我们并不会用到文档的全部内容,只是使用其中几列,这时候就可以使用 $project 进行操作;或者有时候要重命名键值(列名),也可以使用 $project。

对集合 educoder 进行操作:

  • 只输出作者 author 和学习人数 learning_num 信息,_id也不要不显示(_id默认是显示的):
  • 0 为不显示,非 0 为显示。

运行结果如图1所示:

图1

                                                        图 1

db.educoder.aggregate({$project:{_id:0,author:1,learning_num:1}})
  • 重命名字段名(把 learning_num 重命名为 num):

运行结果如图2所示:

db.educoder.aggregate({$project:{course:1,authoe:1,tags:1,num:'$learning_num'}})

图 2

$match 筛选文档输出

有时候我们要在集合中筛选出符合特定条件的文档,这时候使用 $match 便可以很快实现。

只输出作者为“李暾”的文档:

db.educoder.aggregate({$match:{author:'李暾'}})

运行结果如图3所示:

图3

图 3

> use test1
switched to db test1
 
> db.educoder.insert({_id:1,course:'Python表达式问题求解实训',author:'李暾',tags:['Python基础','求解'],learning_num:1882})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:2,course:'Java语言之基本语法',author:'余跃',tags:['Java基础','语法'],learning_num:814})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:3,course:'Python面向对象编程实训',author:'李暾',tags:['Python基础','面向对象'],learning_num:143})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:4,course:'Android综合实训之物联网移动应用开发(1)',author:'prophet5',tags:['Android','物联网','移动开发'],learning_num:207})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.find()
{ "_id" : 1, "course" : "Python表达式问题求解实训", "author" : "李暾", "tags" : [ "Python基础", "求解" ], "learning_num" : 1882 }
{ "_id" : 2, "course" : "Java语言之基本语法", "author" : "余跃", "tags" : [ "Java基础", "语法" ], "learning_num" : 814 }
{ "_id" : 3, "course" : "Python面向对象编程实训", "author" : "李暾", "tags" : [ "Python基础", "面向对象" ], "learning_num" : 143 }
{ "_id" : 4, "course" : "Android综合实训之物联网移动应用开发(1)", "author" : "prophet5", "tags" : [ "Android", "物联网", "移动开发" ], "learning_num" : 207 }
 
> db.educoder.aggregate({$project:{_id:0,course:1,learning_num:1}})
{ "course" : "Python表达式问题求解实训", "learning_num" : 1882 }
{ "course" : "Java语言之基本语法", "learning_num" : 814 }
{ "course" : "Python面向对象编程实训", "learning_num" : 143 }
{ "course" : "Android综合实训之物联网移动应用开发(1)", "learning_num" : 207 }
 
> db.educoder.aggregate({$match:{learning_num:1882}})
{ "_id" : 1, "course" : "Python表达式问题求解实训", "author" : "李暾", "tags" : [ "Python基础", "求解" ], "learning_num" : 1882 }

优化

db.educoder.insertMany([
    {
        _id:1,
        course:'Python表达式问题求解实训',
        author:'李暾',
        tags:['Python基础','求解'],
        learning_num:1882
    },
    {
        _id:2,
        course:'Java语言之基本语法',
        author:'余跃',
        tags:['Java基础','语法'],
        learning_num:814
    },
    {
        _id:3,
        course:'Python面向对象编程实训',
        author:'李暾',
        tags:['Python基础','面向对象'],
        learning_num:143
    },
    {
        _id:4,
        course:'Android综合实训之物联网移动应用开发(1)',
        author:'prophet5',
        tags:['Android','物联网','移动开发'],
        learning_num:207
    }
])
#********* Begin *********#
echo "

db.educoder.aggregate({\$project:{_id:0,course:1,learning_num:1}});
db.educoder.aggregate({\$match:{learning_num:1882}})

"
#********* End *********#

二、聚合管道操作符将文档定制格式输出(二)

任务描述

本关任务:按照编程要求,对集合 educoder 进行相应的查询输出。

相关知识

上一关已经了解了 $project 和 $match 的用法,本关就介绍剩余管道操作符的用法。

在数据库 mydb1 有集合 educoder 内容如下:

_idcourseauthortagslearning_num
1Python表达式问题求解实训李暾Python基础,求解1882
2Java语言之基本语法余跃Java基础,语法814
3Python面向对象编程实训李暾Python基础,面向对象143
4Android综合实训之物联网移动应用开发(1)prophet5Android,物联网,移动开发207
$limit 限制文档数量输出

有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit,输出前2条文档:

db.educoder.aggregate({$limit:2})

运行结果如图1所示:

图1

图 1

$skip 跳过前 n 条文档输出

与 $limit 相反,$skip 是跳过前 n 条文档,显示剩余文档。

将集合 educoder 中的前两条文档跳过,显示剩余文档:

db.educoder.aggregate({$skip:2})
  • $skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;

运行结果如图2所示:

图 2

$limit 与 $skip 可以组合使用,:

db.educoder.aggregate([{$skip:1},{$limit:2}])
#跳过第一条,显示前两条,也就是显示第2-3条文档
db.educoder.aggregate([{$limit:2},{$skip:1}])
#显示前两条,跳过第一条,也就是显示第2条文档

运行结果如图3所示:

图3

                                                                  图 3

 
$unwind 拆分数组类型字段

将 educoder 中的 tags 字段拆分成多条,每条包含数组中的一个值:

db.educoder.aggregate({$unwind:'$tags'})

运行结果如图4所示:

图4

        图 4

$group 分组输出

该操作比较常用,因为文档分组后利于我们的统计。比如,按照作者分组我们就可以统计出该集合总共有几个作者。

在集合 educoder 中,按作者分组:

db.educoder.aggregate({$group:{_id:'$author'}})

运行结果如图5所示:

图5

图 5

$sort 排序输出

按照学习人数 learning_num 降序排序输出文档:

db.educoder.aggregate({$sort:{learning_num:-1}})
  • -1 代表降序排序, 1 代表升序排序。

运行结果如图6所示:

图6

                                                        图 6

> use test2
switched to db test2
 
> db.educoder.insert({_id:1,course:'Python表达式问题求解实训',author:'李暾',tags:['Python基础','求解'],learning_num:1882})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:2,course:'Java语言之基本语法',author:'余跃',tags:['Java基础','语法'],learning_num:814})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:3,course:'Python面向对象编程实训',author:'李暾',tags:['Python基础','面向对象'],learning_num:143})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.insert({_id:4,course:'Android综合实训之物联网移动应用开发(1)',author:'prophet5',tags:['Android','物联网','移动开发'],learning_num:207})
WriteResult({ "nInserted" : 1 })
 
> db.educoder.aggregate({$limit:3})
{ "_id" : 1, "course" : "Python表达式问题求解实训", "author" : "李暾", "tags" : [ "Python基础", "求解" ], "learning_num" : 1882 }
{ "_id" : 2, "course" : "Java语言之基本语法", "author" : "余跃", "tags" : [ "Java基础", "语法" ], "learning_num" : 814 }
{ "_id" : 3, "course" : "Python面向对象编程实训", "author" : "李暾", "tags" : [ "Python基础", "面向对象" ], "learning_num" : 143 }
 
> db.educoder.aggregate({$sort:{learning_num:1}})
{ "_id" : 3, "course" : "Python面向对象编程实训", "author" : "李暾", "tags" : [ "Python基础", "面向对象" ], "learning_num" : 143 }
{ "_id" : 4, "course" : "Android综合实训之物联网移动应用开发(1)", "author" : "prophet5", "tags" : [ "Android", "物联网", "移动开发" ], "learning_num" : 207 }
{ "_id" : 2, "course" : "Java语言之基本语法", "author" : "余跃", "tags" : [ "Java基础", "语法" ], "learning_num" : 814 }
{ "_id" : 1, "course" : "Python表达式问题求解实训", "author" : "李暾", "tags" : [ "Python基础", "求解" ], "learning_num" : 1882 }
 
> db.educoder.aggregate({$skip:2})
{ "_id" : 3, "course" : "Python面向对象编程实训", "author" : "李暾", "tags" : [ "Python基础", "面向对象" ], "learning_num" : 143 }
{ "_id" : 4, "course" : "Android综合实训之物联网移动应用开发(1)", "author" : "prophet5", "tags" : [ "Android", "物联网", "移动开发" ], "learning_num" : 207 }
#********* Begin *********#
echo "

db.educoder.aggregate({\$limit:3});

db.educoder.aggregate({\$sort:{learning_num:1}});

db.educoder.aggregate({\$skip:2})

"
#********* End *********#

三、聚合表达式对文档数据进行统计

任务描述

本关任务:按照编程要求,使用aggregate()方法,结合聚合管道操作符和聚合表达式对文档数据进行统计。

相关知识

为了完成本关任务,你需要掌握: 1.常用聚合表达式; 2.如何结合聚合管道操作符使用聚合表达式完成统计。

聚合表达式

常用的几个聚合表达式:

表达式用法
$sum计算总和
$avg计算平均值
$min获取集合中所有文档对应值的最小值
$max获取集合中所有文档对应值的最大值
$push在结果文档中插入值到一个数组中
$addToSet在结果文档中插入值到一个数组中,但不创建副本
$first根据资源文档的排序获取第一个文档数据
$last根据资源文档的排序获取最后一个文档数据
如何对文档进行统计

在数据库mydb2有集合educoder内容如下:

_idcourseauthortagslearning_num
1Python表达式问题求解实训李暾Python基础,求解1882
2Java语言之基本语法余跃Java基础,语法814
3Python面向对象编程实训李暾Python基础,面向对象143
4Android综合实训之物联网移动应用开发(1)prophet5Android,物联网,移动开发207
  • 现在我们通过aggregate()方法来获取每个作者拥有的实训数量,命名为:num_course
db.educoder.aggregate([{$group:{_id:'$author',num_course:{$sum:1}}}])

查询结果如下:

命令解析:

  • 先通过聚合管道操作符$groupauthor字段数据分组;
  • $sum:1的含义:如果前面的情况出现一次,就加1,如果后面为$sum:2,那么前面条件每满足一次就加2
  • 通过aggregate()方法来获取每个作者的实训学习总人数learning_sum

查询结果如下:

#********* Begin *********#
echo "

db.educoder.aggregate([{\$group:{_id:'\$author',first_course:{\$first:'\$course'}}}]);
db.educoder.aggregate([{\$group:{_id:'\$author',learning_avg:{\$avg:'\$learning_num'}}}]);
db.educoder.aggregate([{\$unwind:'\$tags'},{\$group:{_id:'\$tags',course_num:{\$sum:1}}}]);

"
#********* End *********#

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 MySQL 中开启日志记录并排查操作记录

在数据库管理中,能够追踪和审查操作记录是至关重要的。这不仅有助于识别和分析正常的数据库活动,还可以在数据泄露或未经授权的更改发生时进行调查和响应。本文将介绍如何在 MySQL 中开启通用日志记录,并如何排查操作记录。 开启 MySQL 通用…

使用 EFCore 和 PostgreSQL 实现向量存储及检索

随着 ChatGPT 的兴起及其背后的 AIGC 产业不断升温,向量数据库已成为备受业界瞩目的领域。FAISS、Milvus、Pinecone、Chroma、Qdrant 等产品层出不穷。市场调研公司 MarketsandMarkets 的数据显示,全球向量数据库市场规模预计将从 2020 年的 3.2 亿美元增长至 2025 年的 10.5…

机器学习—无量纲化和降维(四)

什么是特征预处理? 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程 1包含内容 数值型数据的无量纲化: 归一化标准化 2特征预处理API sklearn. preprocessing为什么要进行归一化 or 标准化? 特征的单位或者大小相差较大…

MATLAB | 这些美丽大方的弦图居然都是用MATLAB画的?

什么?这些美丽大方的弦图都是MATLAB画的??? 没错都是由我本人开发的弦图绘制工具包实现的: chord chart 弦图https://www.mathworks.com/matlabcentral/fileexchange/116550-chord-chartDigraph chord chart 有向弦图…

【c语言】自定义类型:结构体详解

目录 自定义类型:结构体 结构体类型的声明 结构体变量的创建和初始化 结构的特殊声明 结构的自引用 结构体内存对齐 对其规则 为什么存在内存对齐? 修改默认对⻬数 结构体传参 结构体实现位段 位段的内存分配 位段的跨平台问题 位段的应用…

vue3新手笔记

setup(){}函数,是启动页面后,自动执行的一个函数。所有数据(常量、变量)、函数等等,都要return 出去。 ref函数(可用于基本数据类型,也可以用于复杂数据类型):让页面上的…

Java Set基础篇

目录 前言一、常用Set1.1 Set1.1.1 特点 1.2 HashSet1.2.1 特点1.2.2 使用 1.3 TreeSet1.3.1 特点1.3.2 使用 1.4 LinkedHashSet1.4.1 特点1.4.2 使用 二、对比总结 目录 前言 一、常用Set 1.1 Set Set是一个继承自Collection的接口&#xff1a; public interface Set<…

位图布隆过滤器的原理及实现

目录 位图的概念&#xff1a; 位图的前置知识&#xff1a;位运算 位图的实现&#xff1a; 位图的基本参数和构造方法&#xff1a; 位图的插入&#xff1a; 位图的查找&#xff1a; 位图的删除&#xff1a; 布隆过滤器概念&#xff1a; 布隆过滤器的实现&#xff1a; …

【软件测试之边界值法】

【软件测试之边界值法】(蓝桥杯学习笔记) 我们先来看一个 Java 小程序&#xff0c;如下图所示。 运行这个程序会发生什么事情呢&#xff1f;在这个程序中&#xff0c;目标是为了创建一个有 10 个元素的一维数组&#xff0c;但是&#xff0c;在 Java 语言中&#xff0c;当一个数…

win7无法升级win11,win7无法升级win11系统版本怎么解决

自动微软推出win11后,有不少小伙伴升级安装了。但是,有一些win7用户却安装win11失败,想知道有什么办法能让win7顺利升级win11。关于win7无法升级win11这个问题,最主要原因可能是你的电脑配置不够,毕竟升级win11的门槛要比升级win10还要高,而且还需要支持UEFI安全启动和TP…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境&#xff1a; 我和同学的两台笔记本电脑。 使用我的手机开热点&#xff0c;两台电脑连接热点。 我的&#xff1a; IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

labview技术交流-如何判断一个数是否为质数

问题起源 如何判断一个数是否为质数&#xff0c;其实并不难&#xff0c;只要你知道质数的定义&#xff0c;按照它的定义去编写代码就可以了。但是没有思路的人可能就会一直找不到方向&#xff0c;所以我就简单介绍一下。 还有我想吐槽的点&#xff0c;labview本来就是很小众的语…

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

英特尔AI训练芯片惊艳亮相:速度与性能双超H200,引领AI新浪潮

英特尔甩出全新AI训练芯片&#xff01;跑千亿大模型速度超H200&#xff0c;罕见披露AI浮点性能 大规模AI计算已经进入系统竞赛。 英特尔在年度Intel Vision大会上重磅推出新一代AI训练芯片Gaudi 3&#xff0c;正面向英伟达旗舰芯片发起挑战。会上&#xff0c;英特尔CEO基辛格挥…

html页面跳转的方法

1、加在head里面 <head> <meta http-equiv"refresh" content"1;urlhttps://ha.huatu.com/zt/hnsylkseo/?"> </head> 2、加在body里面 在body里用js <script language"javascript" type"text/javascript">…

C++感受4-HelloWorld中文版——认识编码

及时了解“编码”对编写代码的影响&#xff0c;是中国程序员越早知道越好的知识点。 一分钟了解什么叫“编码”和“解码”&#xff1b;通过实际演示&#xff0c;充分理解中文Windows下&#xff0c;C源代码编码需要注意的地方&#xff1b;通过 -finput-charsetutf8 等 g 编译配置…

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…

【随笔】Git 高级篇 -- 纠缠不清的分支 rebase | cherry-pick(二十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

基于特征的多模态生物信号信息检索与自相似矩阵:专注于自动分割

论文地址&#xff1a;Biosensors | Free Full-Text | Feature-Based Information Retrieval of Multimodal Biosignals with a Self-Similarity Matrix: Focus on Automatic Segmentation (mdpi.com) 论文源码&#xff1a;无 期刊&#xff1a;biosensors 这篇论文提出了一种基…