【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate

目录

一.基础概念

二.数据库的管理

1.创建数据库

2.删除数据库

二.集合的管理

1.显示所有集合

2.创建集合

3.删除当前集合

4.向集合中插入元素

三.文档的管理

1.文档插入

2.文档的更新

3.文档的删除

4.文档查询

(1)查询基本语法:

(2)查询table2集合下的所有文档

(3)查询table2集合下的所有name为zhangsan的记录

(4)查询table2集合下name为zhangsan的其中一个记录

(5)查询结果中的某些列

(6)and操作

(7)or操作

(8)大于小于,等于操作

(9)in,not in

(10)查询空值

(11)匹配查询

(12)使用distinct去重

(13)查询集合中的文档数

四.aggregate() 聚合操作

<1>管道操作如下:

<2>聚合表达式:

 <3>通过实例讲清楚,直接看代码:

<4>准备数据

 <5>查询案例以及语句,共12个

注意点:


一.基础概念

mongodb中,基本的概念是文档,集合,数据库。

MongoDB中的重要概念
序号基本概念说明
1database数据库
2collection集合,也称文档组,相当于mysql中的表table
3ducument文档,相当于mysql表中的行,键值对结构,BSON(binary二进制)
4

    field

字段,也就是mysql表中的列
5index索引

关于主键的说明:MongoDB自动将_id字段设置为主键。MongoDB不支持表的连接。

一个mongodb可以建立多个数据库,一个数据库可以创建多个集合,一个集合很总可以有多个文档,数据库存储在data中。

二.数据库的管理

1.创建数据库

创建数据库使用关键字use,创建并指定当前数据库,具体语法如下:

# 1.创建数据库,例如创建并指定一个school数据库
use <databasename>use school# 2.查看当前数据库
db# 3.查看所有数据库
show dbs

2.删除数据库

# 1.先选中是哪个数据库
use school# 2.删除数据库
db.dropDatabase()

二.集合的管理

集合相当于Mysql中的表结构table.

1.显示所有集合

# 1.显示所有集合(表结构)
show tables; 
show collections

2.创建集合

# name是创建的集合名,option是可选参数,指定有关内存大小及索引的选项
db.createCollection(name,option):

3.删除当前集合

db.school.drop()

4.向集合中插入元素

# 1.向集合中插入单个元素,insertOne({k:v})
db.collection001.insertOne({"name":"jack"})# 2.向集合中插入多个元素,insertMany({k1:v1},{k2:v2}......)
db.collection001.insertOne({"name":"jack"},{"age":18})

三.文档的管理

文档也就是mysql中的行

1.文档插入

每条文档在插入的时候,MongoDB都会维护一个_id作为唯一标识,_id默认会自动生成。

# 1.插入1行
db.table2.insertOne({"name":"zhangsan"})# 2.插入多行
db.table2.insertMany([
{"name":"zhangsan","age":15,"address":"xuzhou"},
{"name":"wangwu","age":20,"address":"nanj"}
])# 3.当然也可以是这种形式的
document = ({"name":"wangwu","age":20,"address":"nanj",tags:['mysql','oracle'],like:100})
db.table2.insertMany([document])

2.文档的更新

文档的更新都是先查出来,再更新。

 <query>:update的查询条件,类似sql update查询内的where后面的条件
 <update>:update的对象和一些更新的操作符,也可以理解为sql update查询内set后面的
 upsert:可选,如果不存在update记录,是否插入objNew,true是插入,false不插入
 multi:可选,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新  5.0之后是废弃的
 writeConcern:可选,抛出异常的级别

db.collection.update(<query>,   // 相当于where操作<update>,  // 相当于set操作{upsert: <boolean>,multi: <boolean>,writeConcern: <document>}
)

注意语法:$set

 // 先查再更新,$set是set// 更新一条,updateOnedb.table3.updateOne({title:"Oracle"},{$set:{title:"MongoDB是NoSQL键-值数据库"}})

3.文档的删除

// 删除集合下的所有文档 
db.collection.deleteMany ({})// 删除status等于A的所有文档
db.collection.deleteMany ({ status : "A" })// 删除status等于D的一个文档
db.collection.delete.One ({ status : "D" })// 当然也可以根据主键删除
db.table2.deleteOne({_id:ObjectId("64ef1442db2b4f63a830119c")})

4.文档查询

文档的查询十分重要,用的最多。

MongoDB查询文档使用find方法,find()方法以非结构化的方式来显示所有文档。

语法:

db.集合名称.find({<query>},....)

等于,不等于,大于等于,大于,小于等于,小于等,看下表:

文档查询对比语法
操作格式例子mysql类比语句
等于{key:value}db.集合名称.find({name:"zhangsan"})where name='zhangsan'
不等于{key:{$ne:value}}db.集合名称.find({age:{$ne:18}})where age != 18
小于{key:{$lt:value}}db.集合名称.find({age:{$lt:18}})where age < 18
小于等于{key:{$lte:value}}db.集合名称.find({age:{$lte:18}})where age <= 18
大于{key:{$gt:value}}db.集合名称.find({age:{$gt:18}})where age > 18
大于等于{key:{$gte:value}}db.集合名称.find({age:{$gte:18}})where age >= 18

(1)查询基本语法:

第一个{}放的是where条件,第二个放的是显示哪些列,或者不显示哪些列,列的值设置为0表示不显示,设置为1设置为显示。

db.table2.find({},{})   

(2)查询table2集合下的所有文档

db.table2.find()

(3)查询table2集合下的所有name为zhangsan的记录

等值查询,name="zhangsan"

db.table2.find({name:"zhangsan"})

(4)查询table2集合下name为zhangsan的其中一个记录

db.table2.findOne({name:"zhangsan"})

(5)查询结果中的某些列

默认为0,0表示不显示,1表示显示该列,1和0是不能同时用的

相当于select name,address from table2

db.table2.find({},{name:1,address:1}) db.table2.find({name:'zhangsan'},{name:1,age:1,address:1,by:1}) 

(6)and操作

逗号链接,

db.table2.find({name:'zhangsan',age:"lisi"},{name:1,age:1,address:1})  
select name,age,address from table2 where name = "zhangsan" and age = "lisi"

(7)or操作

需要在条件前加$or

db.table2.find({$or:[{age:"lisi"},{address:"xuzhou"}]},{name:1,age:1,address:1})

(8)大于小于,等于操作

db.table2.find({age:{$gte:11,$lte:100}})

(9)in,not in

db.table2.find({age:{$in:[10,15,20,18,12]}})

(10)查询空值

db.table2.find({age:null}) 

(11)匹配查询

// 以zha开头的相当于like"zha%
db.table2.find({name:/^zha/})// 相当于like"%zha%
db.table2.find({name:/zha/})

(12)使用distinct去重

db.table2.distinct('name')  
//  相当于select distinct(name) from table2 

(13)查询集合中的文档数

db.table2.count()

四.aggregate() 聚合操作

整个聚合的过程称为管道,由多个步骤构成。一个一个的管道,也就是聚合的步骤,上一个管道操作的结果可以作为下一个管道的初始数据。每一个中间结果都是一个{}

一个管道操作由2分布构成,管道操作,聚合表达式处理 。

<1>管道操作如下:

  • $group:将集合中的文档分组,用于统计结果,_id键对应的值是根据什么分组
  • $match:用于过滤数据,只输出复合条件的文档,$match使用MongoDB的标准查询操作,相当于where,having条件来过滤数据的
  • $project:修改输入文档的结构,可以用来重命名,增加或删除域,也用于创建计算结果以及嵌套文档。   简单来说选择显示哪些元素,0代表不显示,1代表显示
  • $limit:用来限制MongoDB聚合管道返回的文档数
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。 $sort:将输入的文档排序后输出,1是升序排序,-1是降序排序
  • $unwind:将文档中的某个数组类型字段拆分成多条,产生多个文档,每条包含数组中的一个值

<2>聚合表达式:

  • $sum:计算总和
  • $avg:计算平均值
  • $min:获取集合中所有文档对应值的最小值
  • $max:获取集合中所有文档对应值的最大值
  • $push:在结果文档中插入值到一个数组中
  • $first:根据资源文档的排序获取第一个文档数据
  • $last:根据资源文档的排序获取最后一个文档数据

语法:一个大括号表示一个管道处理{}

db.集合名称.aggregate([
{管道操作1:{表达式处理1}},
{管道操作2:{表达式处理1}},
{......}])

 <3>通过实例讲清楚,直接看代码:

<4>准备数据

db.persons.insertMany([{name:"zhangsan",gender:"man",high:180,weight:75,salary:5800,hobby:["basketball","music","money"]},{name:"lisi",gender:"man",high:175,weight:70,salary:6000,hobby:["run","music","money"]},{name:"wangwu",gender:"man",high:178,weight:73,salary:6800,hobby:["video","football","money"]},{name:"zhaoliu",gender:"man",high:160,weight:70,salary:8000,hobby:["video","football","money"]},{name:"lili",gender:"woman",high:160,weight:60,salary:5000,hobby:["video","money"]},{name:"lingling",gender:"woman",high:165,weight:63,salary:6000,hobby:["video","music"]},{name:"jingjing",gender:"woman",high:158,weight:58,salary:5500,hobby:["music","book","run"]},{name:"cuicui",gender:"man",high:178,weight:80,salary:9500,hobby:["video","football","money"]},{name:"xiaohei",gender:"man",high:183,weight:85,salary:6800,hobby:["football","money"]}
])

 <5>查询案例以及语句,共12个

注意点:

  1. $sum:1 是文档中出现一个符合条件的就+1
  2. 最外部的每个{}是一个管道操作,都需要加$,_id是根据什么来分组,里面再由处理表达式具体处理,别忘记加$
  3. value取值的时候:"$name",别忘记加$
  4. 注意value为0,1的操作
// 1.统计出男女生的人数
db.persons.aggregate([{$group:{// _id是根据什么来分组_id:"$gender",// 对性别进行分组,根据每一组符合条件的出现一个文档+1,counter:{$sum:1}}}
])
// 2.统计出男女生身高总数
db.persons.aggregate([{$group:{_id:"$gender",// 对每一组的符合条件的进行求和counter:{$sum:"$high"}}}
])// 3.统计出男女生平均身高
db.persons.aggregate([{$group:{_id:"$gender",counter:{$avg:"$high"}}}
])// 4.分别找出男女生第一个出现的人的身高
db.persons.aggregate([{$group:{_id:"$gender",firster:{$first:"$high"}}}
])
db.persons.find()// 5.分别找出男女生最后一个出现的人的身高,$first,$last,只关注的是每组的第一个,最后一个
db.persons.aggregate([{$group:{_id:"$gender",laster:{$last:"$high"}}}
])
// 6.分别找出男女生最高的身高
db.persons.aggregate([{$group:{_id:"$gender",highest:{$max:"$high"}}}
])
// 7.分别找出男女生最矮的身高
db.persons.aggregate([{$group:{_id:"$gender",lowest:{$min:"$high"}}}
])// 8.按照男女生分类将身高分别放在数组中
db.persons.aggregate([{$group:{_id:"$gender",arr:{$push:"$high"}}}
])// 9.查询身高>160的男女生人数
db.persons.aggregate([{$match:{high:{$gt:160}}},{$group:{_id:"$gender",counter:{$sum:1}}}
])
db.persons.find()
// 10.查询身高>160的男女生人数,只输出人数,限制输出的字段,$project,限制查询字段,0是不输出的字段,1是输出字段
db.persons.aggregate([{$match:{// high:属性的字段high:{$gt:160}}},{$group:{_id:"$gender",counter:{$sum:1}}},{$project:{_id:0,counter:1}}
])// 11.将男女生的人数排序输出,counter:1是正序输出,-1是倒序输出
db.persons.aggregate([{$group:{_id:"$gender",counter:{$sum:1}}},{$sort:{counter:-1}},{$project:{_id:0,counter:1}}])// 12.对男生按照身高进行排序,输出3到5名的姓名和身高
db.persons.aggregate([{$match:{gender:"man"}},{$sort:{high:1}},{$skip:2},{$limit:3},{// 选择显示哪些元素,0代表不显示,1代表显示$project:{_id:0,name:1,high:1}}
])

ok,基本上敲完就知道MongoDB的聚合查询咋回事了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

outlook等客户端报错:-ERR Login fail. Please using weixin token to login

使用outlook配置腾讯邮箱后&#xff0c;无法收取邮件&#xff0c;点击接收/发送所有文件夹&#xff0c; 提示报错&#xff1a; 任务“testqq.com - 正在接收”报告了错误(0x800CCC92):“电子邮件服务器拒绝您登录。请在“帐户设置”中验证此帐户的用户名及密码。 响应服务器:…

注册登录首选,趣味滑块验证码

前言 注册登录账户时&#xff0c;保障账户安全是首要任务&#xff01;使用趣味滑块验证码&#xff0c;既能有效防御恶意攻击&#xff0c;又能为验证过程增添一丝乐趣。让注册和登录变得更加有趣又安全&#xff01; HTML代码 <script src"https://cdn6.kgcaptcha.co…

Linux下 Socket服务器和客户端文件互传

目录 1.项目描述 2.函数准备 2.1 gets函数 2.2 popen函数、fread函数 2.3 access 函数 2.4 exit 函数 2.5 strtok 函数 2.6 chdir函数 3.项目代码 3.1服务器代码 3.2客户端代码 4.问题总结 1.项目描述 基于Soket聊天服务器&#xff0c;实现服务器和客户端的文件传输。…

docker搭建个人网盘和私有仓库Harbor

目录 1、使用mysql:5.7和 owncloud 镜像&#xff0c;构建一个个人网盘 2、安装搭建私有仓库 Harbor 1、使用mysql:5.7和owncloud&#xff0c;构建一个个人网盘 1.拉取mysql:5.6镜像&#xff0c;并且运行mysql容器 [rootnode8 ~]# docker pull mysql:5.7 [rootnode8 ~]# doc…

8.Redis-set

Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下&#xff1a; 集合…

DeU-Net: 用于三维心脏mri视频分割的可变形(Deformable)U-Net

论文链接&#xff1a;https://arxiv.org/abs/2007.06341 代码链接&#xff1a;文章都看完了实在找不到代码&#xff01;好崩溃&#xff01;好崩溃&#xff01;已经发邮件联系作者&#xff01; 摘要 心脏磁共振成像(MRI)的自动分割促进了临床应用中高效、准确的体积测量。然而…

如何在SOLIDWORKS中更改单位-硕迪科技

SOLIDWORKS中的单位系统 SOLIDWORKS中的单位系统可以针对单个文件修改、一次修改多个文件以及在默认模板中进行修改。每个SOLIDWORKS文件都有一个单位系统&#xff0c;该单位系统由该文件的文档属性控制。默认情况下&#xff0c;SOLIDWORKS零件、装配体和工程图模板各自规定了…

【AIGC专题】Stable Diffusion 从入门到企业级应用0414

一、前言 本文是《Stable Diffusion 从入门到企业级应用实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》的第0414篇 利用Stable Diffusion ControlNet 法线贴图模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态体…

BLE Mesh蓝牙mesh网多跳大数据量高带宽传输数据方法

1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版&#xff0c;Mesh扩大了蓝牙在应用中的规模和范围&#xff0c;因为它同时支持超过三万个网络节点&#xff0c;可以跨越大型建筑物&#xff0c;不仅可以使得医疗健康应用更加方便快捷&#xff0c;还能监测像学…

Python调用Jumpserver的Api接口增删改查

引言 Jumpserver是一款强大的堡垒机系统&#xff0c;可以有效管理和控制企业内部服务器的访问权限&#xff0c;提高网络安全性。本文将介绍如何使用Python编程语言&#xff0c;结合Jumpserver提供的API接口&#xff0c;实现对跳板机的管理和操作。 1、什么是Jumpserver&#…

Python Tcp编程

网络连接与通信是我们学习任何编程语言都绕不过的知识点。Python 也不例外&#xff0c;本文就介绍因特网的核心协议 TCP &#xff0c;以及如何用 Python 实现 TCP 的连接与通信。 TCP 协议 TCP协议&#xff08;Transmission Control Protocol&#xff0c; 传输控制协议&#…

code阶段——gitgitlab安装

在code阶段&#xff0c;我们需要将不同版本的代码存储到一个仓库中&#xff0c;常见的版本控制工具就是SVN或者Git&#xff0c;这里我们采用Git作为版本控制工具&#xff0c;GitLab作为远程仓库。 Git安装 https://git-scm.com/&#xff08;傻瓜式安装&#xff09; GitLab安…

leetcode 143. 重排链表

2023.9.5 先将链表中的节点存储到数组中&#xff0c;再利用双指针重新构造符合条件的链表。代码如下&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNod…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁 为了提高数据库并发度&#xff0c;每次锁定的数据范围越小越好&#xff0c;理论上每次只锁定当前操作的数据的方案会得到最大的并发度&#xff0c;但管理锁是很耗资源&#xff08;涉及获取、检查、释放锁等动作)。因…

统一潮流控制器 (UPFC) 的应用,以增强电力系统中的电压稳定性(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

智能机器人:打造自动化未来的关键技术

文章目录 1. 智能机器人的基本概念2. 智能机器人的关键技术2.1 机器视觉2.2 机器学习与深度学习2.3 传感器技术 3. 智能机器人的应用领域3.1 制造业3.2 医疗保健3.3 农业3.4 服务业 4. 智能机器人的未来趋势4.1 自主决策能力的提升4.2 协作与互操作性4.3 个性化定制4.4 环境感知…

4.矩阵的几何意义、变基与迹

文章目录 变基操作与矩阵矩阵的迹几何意义矩阵迹的几条性质 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 变基操作与矩阵 我们知道空间中一点的坐标可以表示以原点为起点以该点为终点的向量。 以二维平面为例&#xff0c;如下图 选取…

对可再生能源和微电网集成研究的新控制技术和保护算法进行基线和测试及静态、时域和频率分析研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在VScode中如何将界面语言设置为中文

VSCode安装后的默认界面是只有英文的&#xff0c;如果想用中文界面&#xff0c;那么就需要安装对应的插件&#xff0c;vscode插件可以从扩展中心去搜索并安装。 安装vscode后打开vscode&#xff0c;点击左侧的扩展按钮。 在搜索框中输入chinese&#xff0c;弹出chinese&#x…

1.2 向量代数

1.向量的概念 定义&#xff1a; 既有大小&#xff0c;又有方向。 向量的表示法 记有向线段的起点A与终点B&#xff0c;从点A指向B的箭头表示了这条线端的方向&#xff0c;线段的长度表示了这条线段的大小&#xff0c;向量就可用这样的一条有向线段来表示&#xff0c; 记作&a…