【数据库】通过实例讲清楚,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
 // 更新一条,updateOne
 db.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的聚合查询咋回事了

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

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

相关文章

多机单目标跟踪Cross-Drone Transformer Network for Robust Single Object Tracking

1. 摘要 无人机已被广泛用于各种应用&#xff0c;如空中摄影和军事安全&#xff0c;因为与固定摄像机相比&#xff0c;无人机具有高机动性和广阔的视野。多架无人机跟踪系统可以通过收集不同视角的互补视频片段来提供丰富的目标信息&#xff0c;特别是当目标在某些视角下被遮挡…

SPSS统计作图教程:百分条图堆积条图

1、问题与数据 某研究者想看不同年龄分组人群&#xff08;Age_cat&#xff09;中不同程度的维生素D缺乏&#xff08;VD&#xff09;的百分构成比&#xff0c;部分数据如图1。研究者想以条图形式来展现&#xff0c;该如何操作呢&#xff1f; 图1 部分数据 2. 具体操作&#xf…

【小沐学Python】UML类图的箭头连线关系总结(python+graphviz)

文章目录 1、简介1.1 类图1.2 Graphviz 2、Graphviz2.1 安装2.2 命令行测试2.3 python测试 3、关系3.1 实现3.2 泛化3.3 关联3.4 依赖3.5 聚合3.6 组合 结语 1、简介 UML&#xff08;unified modeling language&#xff0c;统一建模语言&#xff09;是一种常用的面向对象设计的…

逻辑回归Logistic

回归 概念 假设现在有一些数据点&#xff0c;我们用一条直线对这些点进行拟合&#xff08;这条直线称为最佳拟合直线&#xff09;&#xff0c;这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方程。 最后结果用sigmoid函数输出 因此&#xff0c;为了实现 Logisti…

前端基础4——jQuery

文章目录 一、基本了解1.1 导入jQuery库1.2 基本语法1.3 选择器 二、操作HTML2.1 隐藏和显示元素2.2 获取与设置内容2.3 获取、设置和删除属性2.4 添加元素2.5 删除元素2.6 设置CSS样式 三、jQuery Ajax3.1 基本语法3.2 回调函数3.3 常用HTTP方法3.4 案例一3.4.1 准备工作3.4.2…

PostgreSQL 查询语句大全

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

如何使用『Nginx』配置后端『HTTPS』协议访问

前言 本篇博客主要讲解如何使用 Nginx 部署后端应用接口 SSL 证书&#xff0c;从而实现 HTTPS 协议访问接口&#xff08;本文使用公网 IP 部署&#xff0c;读者可以自行替换为域名&#xff09; 申请证书 须知 请在您的云服务平台申请 SSL 证书&#xff0c;一般来说证书期限…

安卓逆向 - Frida反调试绕过

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;谢绝转载&#xff0c;若有侵权请联系我删除&#xff01; 本文案例 app&#xff1a;5Lqs5LicYXBwMTEuMy4y 一、引言&#xff1a; Frida是非常优秀的一款 Hook框架&#…

word导出为HTML格式教程,同时也导出图片

在写文档教程时&#xff0c;有时需要借鉴人家的专业文档内容&#xff0c;一般都是word格式文档。word直接复制里面的内容&#xff0c;帐帖到网站编辑器会有很多问题&#xff0c;需要二次清楚下格式才行&#xff0c;而且图片是没办法直接复制到编辑器内的。所以最方便的办法是将…

lv3 嵌入式开发-3 linux shell命令(文件搜索、文件处理、压缩)

目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut 3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 1 …

在STS里使用Gradle编译Apache POI5.0.0

1、到官方下面地址下载Gradle最新的版本 Gradle Distributions 2、解压后拷贝到D盘下D:\gradle-8.3-rc-4里 3、配置环境变量 新建系统变量 GRADLE_HOME &#xff0c;值为 路径 4、在 Path 中添加上面目录的 bin 文件路径 &#xff08;可以用 %GRADLE_HOME%\bin&#xff0c…

【python爬虫】5.爬虫实操(歌词爬取)

文章目录 前言项目&#xff1a;寻找周杰伦分析过程代码实现重新分析过程什么是NetworkNetwork怎么用什么是XHR&#xff1f;XHR怎么请求&#xff1f;json是什么&#xff1f;json数据如何解析&#xff1f;实操&#xff1a;完成代码实现 一个总结一个复习 前言 这关让我们一起来寻…

React笔记(三)类组件(1)

一、组件的概念 使用组件方式进行编程&#xff0c;可以提高开发效率&#xff0c;提高组件的复用性、提高代码的可维护性和可扩展性 React定义组件的方式有两种 类组件&#xff1a;React16.8版本之前几乎React使用都是类组件 函数组件:React16.8之后&#xff0c;函数式组件使…

Kubernetes可视化管理工具Kuboard部署使用及k8s常用命令梳理记录

温故知新 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 安装 Kubernetes 多集群管理工具 - Kuboard v3&#x1f4d7;部署方式&#x1f4d7;通过Kuboard v3 - Kubernetes安装&#xff08;在master节点执行)&#x1f4…

Blender 围绕自身的原点旋转与游标旋转

默认情况下的旋转是&#xff0c;R后旋转是物体自身的原点旋转 可以修改为围绕游标旋转&#xff0c;通过旋转R时 局部与全局坐标 全局的坐标不会变 局部的会随着物体的旋转变化 如果平稳时GZZ会在全局到局部坐标之间切换 或在局部到全局之间的切换 学习视频&#xff1a;【基础…

C++ do...while 循环

不像 for 和 while 循环&#xff0c;它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。 do…while 循环与 while 循环类似&#xff0c;但是 do…while 循环会确保至少执行一次循环。 语法 C 中 do…while 循环的语法&#xff1a; do {statement(s…

【Unity】常见的角色移动旋转

在Unity 3D游戏引擎中&#xff0c;可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式&#xff1a; 欧拉角&#xff08;Euler Angles&#xff09;&#xff1a;欧拉角是一种常用的旋转表示方法&#xff0c;通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Un…

攻防世界-Caesar

原题 解题思路 没出现什么特殊字符&#xff0c;可能是个移位密码。凯撒密码加密解密。偏移12位就行。

【AWS实验】 配置中转网关及对等连接

文章目录 实验概览目标实验环境任务 1&#xff1a;查看网络拓扑并创建基准任务 2&#xff1a;创建中转网关任务 3&#xff1a;创建中转网关挂载任务 4&#xff1a;创建中转网关路由表任务 4.1&#xff1a;创建路由表关联任务 4.2&#xff1a;创建路由传播 任务 5&#xff1a;更…

腾讯云国际代充-GPU服务器安装驱动教程NVIDIA Tesla

腾讯云国际站GPU 云服务器是基于 GPU 的快速、稳定、弹性的计算服务&#xff0c;主要应用于深度学习训练/推理、图形图像处理以及科学计算等场景。 GPU 云服务器提供和标准腾讯云国际 CVM 云服务器一致的方便快捷的管理方式。 GPU 云服务器通过其强大的快速处理海量数据的计算性…