当前位置: 首页 > news >正文

MongoDB基础

优质博客 IT-BLOG-CN

一、简介

MongoDB是一个强大的分布式文件存储的NoSQL数据库,天然支持高可用、分布式和灵活设计。由C++编写,运行稳定,性能高。为WEB应用提供可扩展的高性能数据存储解决方案。主要解决关系型数据库数据量大,并发高导致查询效率低下的问题,通过使用内存代替磁盘提高查询性能。

MongoDB特点:
【1】模块自由:可以把不同结构的文档存在在同一个数据库里;
【2】面向集合的存储:适合存储JSON风格文件的形式;
【3】完整的索引支持:对任何属性都可以加索引;
【4】复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。从而提供冗余备份及自动故障转移;
【5】自动分片:支持云级别的伸缩性,自动分片功能支持水平的数据库集群,可动态添加额外的机器;
【6】丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组;
【7】快速更新查询:查询优化器会分析查询表示式,并生成一个高效的查询计划;
【8】高效的传统存储方式:支持二进制数据及大型对象(如图片);

二、基本操作

MongoDB将数据存储在一个文件,数据结构由键值key:value对组成,类似于JSON对象,字段值包含其他文档、数组、文档数组。

SQL术语MongoDB术语说明
DataBaseDataBase数据库
TableCollection数据库表/集合:存储多个文档,结构不固定{'name':'zzx','gender':'男'}{'class':'一班','count':'10'}
RowDocument数据记录行/文档就是一个对象,由键值对构成,是JSON扩展的BSON格式{'name':'zzx','gender':'男'}
ColumnField数据字段/域
IndexIndex索引
Table Joins表连接,MongoDB不支持
Primary KeyPrimary Key主键,MongoDB自动将_id设置为主键

集合操作

// 创建
db.createCollection(name, options) 
// 查看集合
show collections
// 删除
db.集合名称.drop()

name要创建的集合名称,options是一个文档,用于制定集合的配置,选项参数是可选的:参数capped:默认为false表示不设置上限;参数size:当capped值为true时,需要指定此参数,表示设置上限的大小,会覆盖之前的值,单位为字节。

db.createCollection("stu")
db.createCollection("stu", { capped: true, size: 20})

数据类型

类型说明
Object ID文档ID,每个文档都有一个属性,为_id保证一个文档的唯一性,可以自己设置,如果没有设置自动提供一个特别的_id,类型为objectID:12字节的十六进制数,前4个字节时时间戳,接下来3个字节是机器ID,接下来2个字节服务进程ID最后三位是增量值
String字符串UTF-8
Boolean布尔
Integer整形
Double布尔
Arrays数组或列表
Object嵌入式的文档,MongoDB是不能维护关系的,可以通过嵌入文档的形式来维护这个关系
Null空值
Timestamp时间戳
Date日期UNIX时间格式

文档操作

// 插入
db.集合名称.insert(document)//案例1
db.stu.insert({name:'zzx',gender:1}) //自动生成_id
//案例2
s1={_id:'43444433',name:'zzx'}
s1.gender=0
db.stu.insert(s1)// 修改
db.集合名称.update(<query>, // 查询条件,类似sql中的where部分<update>,  // 类似sql中的 set部分{$multi:<boolean>} // 默认false值改第一条记录,true表示修改满足的所有数据
)//案例
db.stu.update({name:'zzx'},{name:'fj'}) // 整个文档的结构都会发生变化
db.stu.update({name:'zzx'},{$set:{name:'fj'}}) // 只会修改 name的属性// 保存:如果数据存在进行修改,不存在进行插入
db.集合名称.save(document)// 删除
db.集合名称.remove(<query>,{justOne:<boolean> //默认false会删除多条}
)

查询操作

// 查询
db.集合名称.find(条件文档)
// 查询一条数据
db.集合名称.findOne(条件文档)//案例 and和or一起使用。运算法符:$lt小于 $lte小于等于 $gt大于 $gte大于等于 $ne不等于 使用//或者$regex编写正则表达式
db.stu.find({$or:[{age: {$gte: 18}}, {gender: 1}], name: 'zzx'})
db.stu.find({name:{$regex:'^黄'}})
db.stu.find({name:/^/})// ** 自定义查询:使用 $where后面写一个函数
db.stu.find({$where:function(){return this.age > 20}})// limit()用于读取指定数量的文档
db.集合名称.find().limit(NUMBER) //NUMBER表示文档的条数
// skip()用于跳过指定数量的文件,配合limit实现分页功能,与limit同时使用的时候不分先后顺序。
db.集合名称.find().skip(NUMBER)//投影:查询的结构集只选择必要的字段
db.集合名称.find({},{字段名称:1,...}) // 对需要显示的字段设置为1,id默认会返回,如果不想返回可以设置为0// 排序 sort()
db.集合名称.find().sort({字段:1,...}) // 1升序,-1降序
// 统计 count()
db.集合名称.find().count({条件}) //find可以省略
db.stu.count({age:{$gt:20},gender:1})// 去重distinct()
db.集合名称.distinct({去重字段,{条件}})

聚合

主要用于计算数据,类似sql中的sum()avg()

常用的管道:$group将集合中的文档分组,可用于统计结果;$match过滤数据,只输出符合条件的文档;$project修改输入文档的结构,如重命名、增加、删除字段、创建计算结果;$sort将输入文档排序后输出;$limit限制聚合管道返回的文档数;$skip跳过指定数量的文档,返回剩余文档;$unwind将数组类型的字段进行拆分;

常用的表达式:$sum计算综合,$sum:1count表示计数;$avg计算平均值;$min获取最小值;$max获取最大值;$push在结果文档中插入值到下一个数组中;$first根据资源文件的排序获取第一个文档数据;$last根据资源文档的排序获取最后一个文档数据。

db.集合名称.aggregate([{管道:{表达式}}]) //管道在Linux中一般用于将当前命令的输出结果作为下一个命令的输入,在MongoDB中是同样的作用

分组$group

// 统计男女的总人数 _id表示组分的依据,使用某个字段的格式为'$字段',如果需要得到整个文档可以使用 '$$ROOT' 替换 '$age'
db.stu.aggregate([{$group:{_id:'$gender',counter:{$push:'$age'}}}
])
// 输入
{"_id":,"counter":[12,45]}
{"_id":,"counter":[22,15]}

过滤数据$match

db.stu.aggregate([{$match:{age:{$gt:20}}},{$group:{_id:'$gender',counter:{$sum:1}}}
])

投影$project:只显示某个字段

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$project:{_id:0,counter:1}}
])

排序$sort

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}}
])

$limit 和 $skip

db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}},{$sort:{counter:-1}},{$skip:1},{$limit:1}
])

$unwind 将数组类型的字段进行拆分,如果不是数组是一个属性,就单独输出该属性

db.集合名称.aggregate([{$unwind:'$字段名称'}])db.stu.insert({name:'zzx',size:['S','Z','L']})
db.stu.aggregate([$unwind:'$size'
])// 处理是空数组,无字段,null的情况使用上述 $unwind数据会丢失,可以使用下面表达式,防止数据丢失
db.stu.aggregate([{$unwind:{path:'$字段名称',preserverNullAndEmptyArrays:<boolean> //防止数据丢失}}
])

三、索引

MongoDB通过索引提升查询速度

// 使用explain()命令分析查询性能
db.stu.find({name:'zzx100000'}).explain('executionStats')
// 分析结果如下:
"executionStats": {"executionSuccess": true,"nReturned": 1,"executionTimeMillis": 96,"totalKeysExamined": 0,"totalDocsExamined": 100000,
}

建立索引: 1表示升序,-1表示降序

db.集合.ensureIndex({属性:1})
db.stu.ensureIndex({name:1})// 对索引属性查询
db.stu.find({name:'zzx100000'}).explain('executionStats')
// 分析结果如下:
"executionStats": {"executionSuccess": true,"nReturned": 1,"executionTimeMillis": 1,"totalKeysExamined": 0,"totalDocsExamined": 100000,
}// 唯一索引
db.stu.ensureIndex({'name':1},{'unique':true})
// 联合索引
db.stu.ensureIndex({name:1,age1})
// 查看索引
db.stu.getIndexes()
// 删除所以
db.stu.dropIndexes('索引名称')

四、安全

为了更安全的访问MongoDB,需要创建用户。采用角色、用户、数据库的安全管理方式。常用的角色如下:root只在admin数据库中可用,超级账号,超级权限。Read用户只读权限,readWrite用户读写权限。

// 创建超级管理员
use admin // admin是数据库
db.createUser({user:'admin',pwd:'123',roles:[{role:'root',db:'admin'}]
})

启用安全认证:修改配置文件

sudo vi /etc/mongod.conf

启用身份认证:keys and values之间一定要有空格,否则解析错误。修改完配置文件后,必须重启服务。

security:authorization: enable

数据库连接

mongo -u admin -p 123 --authenticationDatabase admin

五、备份与恢复

复制提供数据冗余备份,并在多个服务器上存储数据副本,提高数据的可用性,并保证数据的安全性,允许从硬件故障和服务中断中恢复数据。常见的搭配是一主多从。主节点记录所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证数据的一致性。

优点:
【1】数据备份;
【2】数据灾难恢复(自动故障转移,自动恢复);
【3】读写分离;
【4】高数据可用;
【5】无宕机维护;
【6】副本集对应用程序是透明的;

设置复制节点:

mongod --bind_ip 192.168.113.122 --port 27017 --dbpath ./mongdb/file1 --replSet rs0 // rs0副本集,master和slave的副本集相同
mongod --bind_ip 192.168.154.132 --port 27017 --dbpath ./mongdb/file1 --replSet rs0

通过客户端连接MongoDB master,并在master上面进行初始化,同时添加其他副本集(也就是备份的服务器信息)。如果在从服务器上进行读操作,需要设置rs.slaveOk()

mongo --host 192.168.113.122 --port 27017 // 主服务器rs.initiate()  //rs是mongodb提供的副本集管理对象rs.add('192.168.154.132:27017') // 从服务器rs.salveOk()

手动备份:

mongodump -h dbhost -d dbname -o dbdirectory 

恢复:

mongorestore -h dbhost -d dbname --dir dbdirectory

相关文章:

MongoDB基础

优质博客 IT-BLOG-CN 一、简介 MongoDB是一个强大的分布式文件存储的NoSQL数据库&#xff0c;天然支持高可用、分布式和灵活设计。由C编写&#xff0c;运行稳定&#xff0c;性能高。为WEB应用提供可扩展的高性能数据存储解决方案。主要解决关系型数据库数据量大&#xff0c;并…...

【Linux】Linux基本指令(下)

前言&#xff1a; 紧接上期【Linux】基本指令&#xff08;上&#xff09;的学习&#xff0c;今天我们继续学习基本指令操作&#xff0c;深入探讨指令的基本知识。 目录 &#xff08;一&#xff09;常用指令 &#x1f449;more指令 &#x1f449;less指令&#xff08;重要&…...

基于uniapp+u-view开发小程序【技术点整理】

一、上传图片 1.实现效果&#xff1a; 2.具体代码&#xff1a; <template><view><view class"imgbox"><view>职业证书</view><!-- 上传图片 --><u-upload :fileList"fileList1" afterRead"afterRead"…...

投稿指南【NO.7】目标检测论文写作模板(初稿)

中文标题&#xff08;名词性短语&#xff0c;少于20字&#xff0c;尽量不使用外文缩写词&#xff09;张晓敏1&#xff0c;作者1,2***&#xff0c;作者2**&#xff0c;作者2*&#xff08;通信作者右上标*&#xff09;1中国科学院上海光学精密机械研究所空间激光传输与探测技术重…...

【绘图】比Matplotlib更强大:ProPlot

✅作者简介&#xff1a;在读博士&#xff0c;伪程序媛&#xff0c;人工智能领域学习者&#xff0c;深耕机器学习&#xff0c;交叉学科实践者&#xff0c;周更前沿文章解读&#xff0c;提供科研小工具&#xff0c;分享科研经验&#xff0c;欢迎交流&#xff01;&#x1f4cc;个人…...

经典七大比较排序算法 ·上

经典七大比较排序算法 上1 选择排序1.1 算法思想1.2 代码实现1.3 选择排序特性2 冒泡排序2.1 算法思想2.2 代码实现2.3 冒泡排序特性3 堆排序3.1 堆排序特性&#xff1a;4 快速排序4.1 算法思想4.2 代码实现4.3 快速排序特性5 归并排序5.1 算法思想5.2 代码实现5.3 归并排序特性…...

【网络安全工程师】从零基础到进阶,看这一篇就够了

学前感言 1.这是一条需要坚持的道路&#xff0c;如果你只有三分钟的热情那么可以放弃往下看了。 2.多练多想&#xff0c;不要离开了教程什么都不会&#xff0c;最好看完教程自己独立完成技术方面的开发。 3.有问题多google,baidu…我们往往都遇不到好心的大神&#xff0c;谁…...

素描-基础

# 如何练习排线第一次摸板子需要来回的排线&#xff0c;两点然后画一条线贯穿两点画直的去练 练线的定位叫做穿针引线法或者两点一线法 练完竖线练横线 按照这样去练顺畅 直线曲线的画法 直线可以按住shift键 练习勾线稿 把线稿打开降低透明度去勾线尽量一笔的去练不要压…...

Elasticsearch:高级数据类型介绍

在我之前的文章 “Elasticsearch&#xff1a;一些有趣的数据类型”&#xff0c;我已经介绍了一下很有趣的数据类型。在今天的文章中&#xff0c;我再进一步介绍一下高级的数据类型&#xff0c;虽然这里的数据类型可能和之前的一些数据类型有所重复。即便如此&#xff0c;我希望…...

Golang每日一练(leetDay0012)

目录 34. 查找元素首末位置 Find-first-and-last-position-of-element-in-sorted-array &#x1f31f;&#x1f31f; 35. 搜索插入位置 Search Insert Position &#x1f31f; 36. 有效的数独 Valid Sudoku &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 …...

Web前端:6种基本的前端编程语言

如果你想在前端web开发方面开始职业生涯&#xff0c;学习JavaScript是必须的。它是最受欢迎的编程语言&#xff0c;它功能广泛&#xff0c;功能强大。但JavaScript并不是你唯一需要知道的语言。HTML和CSS对于前端开发至关重要。他们将帮助你开发用户友好的网站和应用程序。什么…...

九【springboot】

Springboot一 Spring Boot是什么二 SpringBoot的特点1.独立运行的spring项目三 配置开发环境四 配置开发环境五 创建 Spring Boot 项目1.在 IntelliJ IDEA 欢迎页面左侧选择 Project &#xff0c;然后在右侧选择 New Project&#xff0c;如下图2.在新建工程界面左侧&#xff0c…...

《程序员成长历程的四个阶段》

阶段一&#xff1a;不知道自己不知道(Unconscious incompetence) 大学期间&#xff0c;我和老师做过一些小项目&#xff0c;自认为自己很牛&#xff0c;当时还去过一些公司面试做兼职&#xff0c;但是就是不知道为什么没有回复。那个时期的我&#xff0c;压根不知道自己不知道&…...

【SpringBoot】Spring data JPA的多数据源实现

一、主流的多数据源支持方式 将数据源对象作为参数&#xff0c;传递到调用方法内部&#xff0c;这种方式增加额外的编码。将Repository操作接口分包存放&#xff0c;Spring扫描不同的包&#xff0c;自动注入不同的数据源。这种方式实现简单&#xff0c;也是一种“约定大于配置…...

uni-app基础知识介绍

uni-app的基础知识介绍 1、在第一次将代码运行在微信开发者工具的时候&#xff0c;应该进行如下的配置: &#xff08;1&#xff09;将微信开发者工具路径进行配置&#xff1b; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lbyk5Jw2-16790251840…...

Word2010(详细布局解释)

目录一、界面介绍二、选项卡1、文件选项卡&#xff08;保存、打开、新建、打印、保存并发送、选项&#xff09;2、开始选项卡&#xff08;剪贴板、字体、段落、样式、编辑&#xff09;3、插入选项卡&#xff08;页、表格、插图、链接、页眉页脚、文本、符号&#xff09;4、页面…...

Spring如何实现Quartz的自动配置

Spring如何实现Quartz的自动配置1. 开启Quartz自动配置2. Quartz自动配置的实现过程2.1 核心类图2.2 核心方法3. 任务调度执行3.1 大致流程3.2 调整线程池的大小如果想在应用中使用Quartz任务调度功能&#xff0c;可以通过Spring Boot实现Quartz的自动配置。以下介绍如何开启Qu…...

计算机组成原理——作业四

一. 单选题&#xff08;共11题&#xff0c;33分&#xff09; 1. (单选题, 3分)四片74181 ALU和一片74182 CLA器件相配合,具有如下进位传递功能:________。 A. 行波进位B. 组内先行进位,组间行波进位C. 组内先行进位,组间先行进位D. 组内行波进位,组间先行进位 我的答案: C 3…...

2023前端面试题(经典面试题)

经典面试题Vue2.0 和 Vue3.0 有什么区别&#xff1f;vue中计算属性和watch以及methods的区别&#xff1f;单页面应用和多页面应用区别及优缺点&#xff1f;说说 Vue 中 CSS scoped 的原理&#xff1f;谈谈对Vue中双向绑定的理解&#xff1f;为什么vue2和vue3语法不可以混用&…...

【Linux内网穿透】使用SFTP工具快速实现内网穿透

文章目录内网穿透简介1. 查看地址2.局域网测试连接3.创建tcp隧道3.1. 安装cpolar4.远程访问5.固定TCP地址内网穿透简介 是一种通过公网将内网服务暴露出来的技术&#xff0c;可以使得内网服务可以被外网访问。以下是内网穿透的一些应用&#xff1a; 远程控制&#xff1a;通过内…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...