文档数据库MongoDB——Windows环境安装与增删改查操作


前言

善始者繁多,克终者盖寡。

一、关系型数据库与非关系型数据库

1.1 何为NoSQL

1970年IBM的一名研究员在《大型共享数据银行的关系模型》中首次提出“关系模型”的概念,为此后关系型数据库奠定了基础。关系型数据库对数据有很严格的格式要求,数据结构是一开始就设计好的,用户必须按照指定的格式存取数据,数据以二维表的形式存放在数据库中,代表性的数据库语言是SQL。以mysql数据库为例,图中展示了名为“books”的表中存放的数据,并且不同表之间还有通过“外键”进行连接,在很长一段时间里关系型数据库都是数据存储的最佳选择。

在这里插入图片描述

但是,关系型数据库严格的数据约束也带来不小的困扰,在如今这个数据量爆炸的时代,其性能可能严重下降;同时,由于关系型数据库中数据结构都是提前设计好的,数据库的扩展是极其困难的。于是乎,19世纪末20世纪初的时候人们开始探索分布式的数据库以弥补关系型数据库的不足。

人们通常称关系型数据库以外的数据库为“非关系型数据库”或“NoSQL”,NoSQL并不是一种严格的分类或者定义,网上对于“NoSQL”的解释众说纷纭,本文提及的 “NoSQL”指代“Not Only SQL” ,是对关系型数据库系统的补充,通常采用分布式数据存储技术,根据其存储形式大致可以分为 文档数据库、列族数据库、键值数据库、图数据库 4种。

MongoDB属于NoSQL中的文档数据库,但是因为MongoDB中以“Key-Value”的形式表示数据,某些人也将其视为键值数据库的一种。

1.2 常见数据库分类

以数据库的存储类型进行分类,常见的数据库有:

在这里插入图片描述

二、NoSQL数据库工作原理

2.1 分布式存储技术

有这样一个情境,我们需要把池子里的10L水用瓶子装起来,可我们只有一个2L的瓶子,想要完成该任务我们有两种解决方案:

  1. 横向扩展:再去拿4个2L的瓶子,5个瓶子刚好把水装完。
  2. 纵向扩展:将原来2L的瓶子换成10L的瓶子,1个瓶子刚好把水装完。

现在回到数据库上,关系型数据库中通常采用纵向扩展的方式扩展数据库的容量,好处是可以在一个物理介质中存入所有数据,缺点是往往伴随处理速度降低、费用过高、制造技术瓶颈等问题。

在NoSQL数据库中往往采用横向扩展的方式处理该问题,将数据均匀的分布到多个节点(物理上的计算机、服务器)上,好处是充分利用各节点计算能力、可以通过备份实现容错,缺点是数据的统一管理、节点间的通讯可能受到限制。例如我们可以将1台计算机中100T的文件均匀的放在4台计算机中。

在这里插入图片描述

2.2 NoSQL数据库设计的局限

一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)是评估分布式系统的重要指标。2000美国加州大学伯克利分校的计算机科学家埃里克·布鲁尔提出猜想:一致性、可用性、分区容错性三者无法同时实现,最多同时实现两个。2002年麻省理工学院的赛斯·吉尔伯特等人证明了其猜想,后该思想被称为 “CAP原理”

  1. 一致性:分布式系统中所有节点都能对某一数据达成共识
  2. 可用性:分布式系统能够给予用户及时的反馈
  3. 分区容错性:当系统中部分节点故障或网络传输中数据丢失时,系统仍能提供正常的服务,以完成数据访问

在这里插入图片描述

CAP原理也适用于NoSQL数据库的设计。
当NoSQL数据库做到CA时,为保证数据的一致性以及对用户的快速响应,就不能做到多副本(多个节点存放同一数据时,若修改其中一处,为保证数据一致性其他节点也必须修改,此过程会花费额外时间,系统对用户的响应速度必然降低,与可用性冲突),系统容错率降低;

当NoSQL数据库做到CP时,为保证数据的一致性以及系统的容错率,会提高系统响应延迟,降低系统可用性(多个节点存放同一数据时,若修改其中一处,为保证数据一致性其他节点也必须修改,此过程会花费额外时间,系统对用户的响应速度必然降低);

当NoSQL数据库做到AP时,为了提高可用性,系统必须舍弃将数据恢复到一致状态的操作,这种情况下很有可能出现A、B节点同一文件副本但内容不同的情况。

综上所述,NoSQL和关系型数据库并不是相互替代的关系,而是相互补充的关系。

2.3 NoSQL数据库的服务保障

一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)不可同时兼备,NoSQL数据库往往采用折中的方式为用户提供 “弱一致性” 的服务保障。

  1. 基本可用(Basically Available):部分节点故障或数据丢失时,保证系统核心和核心功能可用,与可用性(Availability)对应;
  2. 柔性事务(Soft-state):允许系统中存在内容不一致的副本,与分区容错性(Partition Tolerance)对应;
  3. 最终一致(Eventual Consistency)—核心:在一段时间内允许不一致,但最终一致,与一致性(Consistency)对应。

三、MongoDB的安装与配置

3.1 下载与安装

官网下载MongoDB,文件格式有zip和msi两种,推荐新手下载zip格式文件,亲身体验MongoDB的配置过程。

在这里插入图片描述

将下载的文件解压出来放入指定磁盘,例如本人将其放入E盘,并将文件夹重命名为“MongoDB”。

在这里插入图片描述
在当前目录下创建“data”、“log”文件夹用于存放数据和日志。进入data文件夹,创建"db"和“logs”文件夹分别用于存放具体的数据库文件和日志。

在这里插入图片描述在这里插入图片描述

在“logs”文件夹下创建名为“mongodb.log”的日志文件,用于保存MongoDB服务每次启动时的日志信息。

在这里插入图片描述

右键点击“此电脑”,依次点击“属性->高级系统设置->环境变量”配置必要的运行环境。

在这里插入图片描述
在这里插入图片描述

新建系统变量,变量名随意取名,但最好见名思意;变量值为bin文件夹所在的路径。接着找到“Path”,将MongoDB填入其中,此时就可以启动MongoDB服务了。

%MongoDB%

在这里插入图片描述
在这里插入图片描述

3.2 启动与关闭MongoDB服务

进入命令行输入如下指令指定MongoDB的数据库和日志文件存放位置,并在本地服务中添加名为“MongoDB”的服务。

注意:使用cmd打开命令行可能出现权限不够而无法启动服务的情况!!!请使用管理员身份打开命令行或者使用windos自带的shell工具。

mongod --dbpath “E:\MongoDB\data\db” --logpath “E:\MongoDB\data\logs\mongodb.log” --install --serviceName “MongoDB”

解释:

  1. 将"E:\MongoDB\data\db"替换为自己的文件夹所在路径
  2. "MongoDB"可以换成其他词汇,例如MDB、MB,见名思意即可
  3. mongod 是bin文件夹下的一个可执行程序,可自行查看验证,因为配置过环境变量所以可以在命令行中调用

在“E:\MongoDB\bin”目录下长按“shift”,点击右键打开命令行,在命令行输入如下指令开启MongoDB服务。

mongod -dbpath …\data\db
注意:“\data\db” 前是两个点,出现3个是博客显示问题

在这里插入图片描述

在浏览器输入“http://localhost:27017”查看MongoDB服务是否启动成功,页面出现如下提示时说明服务启动成功。

在这里插入图片描述
在命令行按住“ctrl c”或者关闭命令行对话框即可结束服务,MongoDB服务处于关闭状态时,在浏览器输入“http://localhost:27017”会显示连接错误。

在这里插入图片描述

3.3 快捷启动与关闭MongoDB服务

初次启动MongoDB服务并配置好环境变量后,即可通过如下指令快速启动和关闭服务。

启动:
net start MongoDB
关闭:
net stop MongoDB

四、MongoDB的基本术语

4.1 SQL术语-MongoDB术语对比

MongoDB属于NoSQL数据库,但大部分名词、术语都可以在关系型数据库中找到相似的名词、术语。图中显示了MongoDB与关系型数据库部分术语的对比,位于同一行上的两个名词表示其意思十分接近 ,可以视为同种物品的不同描述。

在这里插入图片描述

4.2 文档

说到文档有人会想到这位蓝色图标的朋友在这里插入图片描述,按照通常的思路当然没问题,但是在MongoDB中用中括号括起来的键值对都可以称之为文档。例如下面的字符串就可以称之为一个文档(类似于python中的字典)。

{"姓名":“李白”,“朝代”:“唐”}

在MongoDB中会显示出文档的层级结构,如图所示。蓝色框对应4.1中的“域”,红色框表示“域”映射的数据,所有会有人将MongoDB视为一种“键值数据库”;“_id”由系统自动生成,对应4.1中的“主键”。

在这里插入图片描述

4.3 集合

相较于“文档”,“集合”的概念抽象的多,MongoDB中的集合类似于关系型数据库中的“表”,是一系列数据(文档)的集合。

以mysql为例,由上至下的包含关系为“数据库包含表,表包含记录”,但是在MongoDB中虽然有类似于“表”功能的“集合”,但是,数据(文档)既可以放入集合中,也可以直接放入数据库中,下列两种层级关系都是可行的。

  1. 数据库包含集合A、B、C,集合A包含文档A1、A2
  2. 数据库直接包含文档A1、A2

五、MongoDB的基本操作

5.1 MongoDB Shell

MongoDB自带了交互式的JavaScript Shell,安装并启动MongoDB服务后在命令行输入如下指令启动MongoDB Shell,后续操作均在此Shell环境中进行,默认情况下会打开名为“test”的数据库。

mongosh 或者 mongo (看MongoDB的bin目录下的可执行程序)

在这里插入图片描述

注意:某些版本的MongoDB正常安装并启动后,在命令行输入上述命令后显示“不是系统命令”或“未找到可执行程序”,这是正常情况! 因为某些版本的MongoDB根据就没有自带MongoDB Shell,需要我们手动下载和安装。

** 手动安装MongoDB Shell **

官网下载Shell,同样推荐下载zip格式,解压后发现其目录结构类似于MongoDB。将下图中“bin”目录下的文件放入MongoDB的“bin”下;将下图中其他文件放入MongoDB中“bin”目录的同级目录下。

在移动文件过程中 “README”文件可能会提示文件名重复,忽略提示即可,该文件对程序运行不起作用。

在这里插入图片描述

5.2 数据库相关操作

5.2.1 创建数据库

在MongoDB中无需提前创建数据库,执行下列命令可选择指定数据库,若数据库不存在系统会先创建该数据库再进行选中。

use mydb

mydb为数据库的名字

5.2.2 查看当前数据库

使用如下命令可查看当前所在数据库的名称。

db

5.2.3 显示所有数据库

通过如下命令可显示所有数据库。

show dbs 或者 show databases

但是,执行上面命令后,我们发现输出栏中并没有“mydb”的信息!因为“mydb”数据库中没有任何信息,所以其并未显示出来。

在这里插入图片描述

在“mydb”中创建集合并向其中插入一条数据,再次执行“show dbs”指令,发现“mydb”数据库已正常显示。
注意:部分高版本MongoDB中会提示insert方法已经过时,但这并不会影响程序正常运行。

在这里插入图片描述在这里插入图片描述

5.2.4 删除数据库

删除数据库前需要先进入到该数据库后执行“db.dropDatabase()”才能进行删除操作,删除完毕后可通过“show dbs”查看该数据库是否还存在。

use mydb
db.dropDatabase()
show dbs

在这里插入图片描述

5.3 插入文档

通过 insert() 可以向MongoDB的数据库或集合中插入文档,例如下列代码表示向数据库mydb中插入文档,文档中包含了学号、姓名、年龄等信息。

db.mydb.insert({"学号":"1001", "姓名":"张三", "年龄":20})

注意:此处为显示方便,在输入代码时进行了换行操作。

在这里插入图片描述

MongoDB Shell还支持部分JavaScript代码,可以通过变量的方式向数据库中添加文档,例如通过变量方式向数据库中再添加一个文档:

list = ({"学号":"1002","姓名":"李四","年龄":19})
db.mydb.insert(list)

在这里插入图片描述

5.4 查询文档

通过 find() 命令查询文档,例如查看mydb中的所有文档信息:

db.mydb.find()

在这里插入图片描述

5.5 更新文档

通过 update() 方法更新数据,该方法参数较多,相对来说复杂一点,以mysql中的更新操作为演示可以更好的理解MongoDB中的updata参数。

在这里插入图片描述

更新mydb中“张三”的年龄,讲年龄修改为99岁,代码如下:

db.mydb.update({"姓名":"张三"},{$set:{"年龄":99}})
db.mydb.find()

在这里插入图片描述

5.6 删除文档

通过 remove() 方法删除文档,同样和mysql中的删除操作进行比较。

在这里插入图片描述
删除“mydb”里文档中属性“姓名”为“李四”的文档,代码如下:

db.mydb.remove({"姓名":"李四"})
db.mydb.find()

在这里插入图片描述

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的墨菲特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值