MongoDB学习
阿里云特性
MongoDB适合场景
传统的关系型数据库(MySQL),在数据的“三高”需求以及web2.0网站的需求,力不从心。
三高需求:
- 高并发
- 高访问
- 高可扩展性&&高可用性
具体的应用场景:
社交场景:存储用户信息,以及用户发表的朋友圈,通过地理位置索引实现附近的人
物流场景:使用MongoDB存储订单信息,订单信息在运输工程中会不断更新
游戏场景,业务快速增长,数据结构动态变更
自动驾驶
物联网设备
视频直播,存储用户信息,点赞互动等
上面的应用场景,数据操作方面的共同特点:
- 数据量大
- 读写操作频繁
- 价值较低的数据,对于事务性要求不高
MongoDB简介
MongoDB是一个开源,高性能,无模式的文档型数据库,当初的设计就是为了简化开发和方便扩展,是最像关系型数据库的非关系型数据库。
它支持的数据结构非常松散,是一种类似于JSON格式的BSON,所以可以存储比较复杂的数据类型,又相当灵活。
MongoDB中的记录是一个文档,由字段和值对(filed:value)组成的数据结构。MongoDB的文档类似json,一个文档就认为是一个对象。
体系结构
MongoDB原理介绍
MongoDB的存储引擎:WireTiger
MongoDB开发
准备:公共数据集;github源码;mongoDB compass
利用MongoDB构建一个UFO观测记录网站。
下载公共数据集(https://www.kaggle.com/datasets/NUFORC/ufo-sightings?select=scrubbed.csv)
下载MongoDB compass(MongoDB Compass Download (GUI) | MongoDB)
构建MongoDB数据库和表,并导入数据。
下载github源码,构建虚拟环境(https://github.com/getsendy/UFO-Spotter/tree/codespace-getsendy-ufo-spotter)
修改代码,运行运用。
功能:
可以选择城市,查询UFO记录
提交新的UFO数据
安装
Windows安装
详细查看windows下的安装
centos7.9安装
其他 Linux 版本可点击链接查看:Install MongoDB Community Edition on Linux — MongoDB Manual
准备
安装前我们需要安装各个 Linux 平台依赖包。
1 | sudo yum install libcurl openssl |
官网下载
官网链接:Download MongoDB Community Server | MongoDB
我复制的地址是:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz
使用wget
:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz
解压
解压命令:tar -zxvf 版本.tgz
1 | tar -zxvf mongodb-linux-x86_64-rhel70-6.0.6.tgz |
移动到指定目录:
1 | mv mongodb-linux-x86_64-rhel70-6.0.6 /usr/local/mongodb4 |
MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
1 | export PATH=<mongodb安装路径>/bin:$PATH |
例如我的安装路径 /usr/local/mongodb4
MongoDB安装
- 下载安装包
可以选择在官网下载好安装包
或者wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.2.tgz
查看下载好的安装包ls
- 解压并将目录重命名为
mongodb
1 | tar -zxf mongodb-linux-x86_64-rhel80-6.0.2.tgz |
- 进入安装包目录
1 | cd mongodb |
其中,bin
目录存放数据库提供的命令
MongoDB Shell 安装
- 下载安装包
1 | wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz |
- 解压
1 | tar -zxf mongosh-1.6.0-linux-x64.tgz |
- 重命名解压后的目录
1 | mv mongosh-1.6.0-linux-x64.tgz mongosh |
在 mongosh/bin
目录下提供了 mongosh
命令用于连接到 MongoDB 数据库服务
- 将 bin 目录添加到 Path 中
有两个bin目录:
- 目前
mongod
命令所在目录路径是~/mongodb/bin
mongosh
命令所在目录路径是~/mongosh/bin
需要将这两个路径添加到 Path 环境变量中。
使用 vim 编辑文件(临时生效):
1 | export PATH=<mongodb安装目录>/bin:$PATH |
本次安装是/root/mongodb
1 | export PATH=/root/mongodb/bin:$PATH |
注:修改 /etc/profile 文件是所有用户,永久生效
在 Path
最后追加这两个目录,然后保存退出:
然后执行source
命令,重新加载环境变量,使刚才的配置生效
1 | source ~/.bash_profile |
连接
MongoDB 服务在启动时需要指定数据存储的目录。如果没有指定的话,默认会去找 /data/db/
目录。
如果数据目录不存在或不可写,那么服务器端将无法启动。因此在启动 MongoDB 服务之前,一定要确保数据目录存在且对该目录有写权限。
先建立两个目录:
1 | mkdir -p /data/mongodb/data |
使用 mongod
命令启动数据库服务:
1 | mongod --dbpath=/data/mongodb/data |
- –fork:在基于 Unix 的系统中,使用 fork 创建服务器进程,将 MongoDB 服务作为守护进程运行。如果指定了 –fork,则必须同时指定 –logpath。
- –dbpath:指定存放 MongoDB 数据的目录,启动服务时必须指定。
- –logpath:默认日志是打印在命令行中的,使用该选项指定日志输出的文件。如果对此目录有写权限且文件不存在,则会自动创建该文件。如果日志文件已经存在,默认会覆盖掉该文件,并删除所有旧的日志。如果希望保留旧的日志,除了使用 –logpath 之外,还应该使用 –logappend 选项。
内容
阿里云云数据库MongoDB实践
先在阿里云创建云数据库MongoDB
登录云数据库MongoDB实例
- 先进入MongoDB控制台
- 点击左侧的,副本实例列表
- 切换资源所在地(选择你购买的所在地)
- 在副本集实例列表进入实例
- 重置密码
- 设置白名单
更换成0.0.0.0/0
- 登录数据库
8.
在登录实例对话框中,输入数据库账号和数据库密码,单击登录。如忘记密码,可以在账号管理页面进行重置密码。(上面有密码重置)
参数说明:
- 数据库账号:输入云产品资源中创建的MongoDB数据库账号(我的是root)。
- 数据库密码:输入云产品资源中创建的MongoDB数据库密码(你自己设置的)。
创建数据库和用户
- 进入数据库管理
然后
- 创建数据库
- 左侧导航,单击账号管理
- 创建用户
- 目标库:选择刚刚创建的数据库(阿里云的是mymonogdb,我的是daokunn)。
- 用户名:自定义用户名,本示例为mytest。
- 密码:自定义密码。
- 确认密码:再次输入密码。
- 普通操作角色:勾选read和readWrite
- 查看用户

创建集合
集合就是MongoDB文档组,类似于RDBMS(关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着您在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
这里是一些基础语法的学习。
在上面的步奏,我们创建了数据库账号、数据库名称和数据库密码。用这个作为测试。
- 进入我们创建的数据库
之后进入以下的界面
- 创建一个集合,名称为testcollection,单击执行
语法
1 | db.createCollection("testcollection"); |
文档操作的使用
文档是一组键值(key-value)对(即BSON)。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点。
- 插入文档。使用insert()方法插入。
1 | db.COLLECTION_NAME.insert(document); |
参数说明:
- COLLECTION_NAME:集合名称。
- document:要写入的文档内容。
实验中,我们写
1 | db.testcollection.insert({title: '阿里云', |
点击确认
执行的结果如下,表示表示已经成功插入一条文档。
- 查询文档。使用find()方法。
1 | db.collection.find(query,projection); |
参数说明:
- query:可选,使用查询操作符指定查询条件。
- projection:可选,使用投影操作符指定返回的键。查询时如果您需要返回文档中所有键值,只需省略该参数即可(默认省略)。
在SQLConsole中,输入如下SQL,单击执行。
1 | db.testcollection.find(); |
在下方执行结果中,您可以看到查询的返回结果。
- 更新文档。使用方法update()来更新集合中的文档,语法格式如下。
1 | db.collection.update( |
参数说明:
- query:必填, update的查询条件,类似sql update查询内where后面的条件。
- update:必填,update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的部分。
- upsert:可选,该参数表示,如果不存在update的记录,是否插入objNew。取值:true(表示插入)|false(默认,表示不插入)。
- multi:可选,该参数表示,是否更新按条件查询到的全部记录。取值:true(表示更新查询到的全部记录)| false(默认,表示只更新查询到的第一条记录)。
- writeConcern:可选,抛出异常的级别。
a. 在SQLConsole中,输入如下SQL,单击执行。
1 | db.testcollection.update({'title':'阿里云'},{$set:{'title':'aliyun阿里云官方网站'}}); |
b. 在执行确认对话框中,单击确认。
下方的执行结果中,您可以看到已经成功更新一条文档。
c. 在SQLConsole中,输入如下SQL,单击执行。
1 | db.testcollection.find(); |
在下方的执行结果中,您可以看到文档的title已经被更新了。
- 删除文档。使用deleteMany()方法来删除文档,语法如下。
1 | db.collection.deleteMany( |
参数说明:
- filter:表示过滤条件,用于规定一个查询规则,筛选出符合该查询条件的所有文档。删除操作将作用于经过该查询条件筛选之后的文档,类似于关系型数据库的where后面的过滤条件。如果要删除集合中的所有文档,请传入一个空文档({ })。
- writeConcern:可选参数,写入关注,其值为一个文档。
- collation:可选参数,指定用于操作的collation。collation允许用户指定特定语言的字符串进行比较规则。
a. 在SQLConsole中,输入如下SQL,单击执行。
1 | db.testcollection.deleteMany({ title : "aliyun阿里云官方网站" }); |
b. 在执行确认对话框中,单击确认。
在下方的执行结果中,您可以看到已经成功删除一条文档。
c. 在SQLConsole中,输入如下SQL,单击执行。
1 | db.testcollection.find(); |
在下方的执行结果中,您可以看到runoob集合中没有文档。
MongoDB 条件操作符的使用
条件操作符用于比较两个表达式并从mongoDB集合中获取数据。
MongoDB中条件操作符有:
- 大于:$gt
- 小于:$lt
- 大于等于:$gte
- 小于等于:$lte
- 在SQLConsole中,输入如下三条插入文档SQL,单击执行。
1 | db.testcollection.insert({ |
- 在执行sql过程中,会出现三次执行确认对话框,需要三次单击确认,。
下方的执行结果中,您可以看到已经成功插入三条文档。
- 使用大于操作符($gt)。
在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 大于100的数据,单击执行。
1 | db.testcollection.find({likes : {$gt : 100}}); |
执行结果如下。
- 使用大于等于操作符($gte)。
在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 大于等于100的数据,单击执行。
1 | db.testcollection.find({likes : {$gte : 100}}); |
执行结果如下。
- 使用小于操作符($lt)。
在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 小于150的数据,单击执行。
1 | db.testcollection.find({likes : {$lt : 150}}); |
执行结果如下。
- 使用小于等于操作符($lte)。
在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 小于等于150的数据,单击执行。
1 | db.testcollection.find({likes : {$lte : 150}}); |
执行结果如下。
MongoDB条件操作符$type的使用
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
在SQLConsole中,输入如下SQL,获取testcollection集合中“title”为String的数据,单击执行。
1 | db.testcollection.find({"title" : {$type : 'string'}}); |
执行结果如下。
MongoDB的limit与skip方法
- MongoDB的limit()方法。limit()方法用于MongoDB中读取指定数量的数据。limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
limit()方法基本语法如下所示。
1 | db.COLLECTION_NAME.find().limit(NUMBER); |
在SQLConsole中,输入如下SQL,查询文档中的两条数据,单击执行。
1 | db.testcollection.find().limit(2); |
执行结果如下。
- MongoDB的skip()方法。我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
1 | db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER); |
在SQLConsole中,输入如下SQL,查询文档中的指定的一条并跳过一条的数据,单击执行。
1 | db.testcollection.find().limit(1).skip(1); |
执行结果如下。
清理
如果您不需要继续使用,请及时清理测试数据和试用资源
云数据库 MongoDB资源清理
登录云数据库 MongoDB控制台,单击云数据库 MongoDB实例右侧的更多>退订,单击确定。
- 【重要】如若您通过试用领取的资源:云数据库 MongoDB(3个月内)试用,具有时长限制,使用完请及时清理相关资源。
地址:MongoDB实验地址
阿里云云数据库MongoDB 快速备份恢复
备份
备份有自动备份和手动备份两种。
设置自动备份
- 在目标实例页面的左侧导航栏,单击备份与恢复,单击全量备份页签,点击备份设置。

- 在备份设置面板,根据业务需求设置以下参数。
- 全量备份保留天数:设置全量备份数据保留天数,取值范围为7~730天。默认为30天。
- 备份时间:设置数据备份时间。以小时为单位选择任意时段,建议您将备份时间设置为业务低峰期的某个时段。
- 星期:设置每周数据备份的频率,默认为7次/周。
- 日志备份:选择是否需要打开日志备份开关,默认打开。如果后续需要按时间点恢复功能,需要打开日志备份。
- 日志备份保留天数:当打开日志备份开关时,您需要设置日志备份保留的天数,取值范围为7~730天,默认为7天。

- 单击确定,完成自动备份设置,后续就会根据设置好的参数进行自动备份。
手动备份
- 在目标实例页面的左侧导航栏,单击备份与恢复。

- 在目标实例页面右上方,单击备份实例。

- 在备份实例 面板,选择备份方法-快照备份 。

- 单击确定后,会开启备份,备份完成后,在备份列表部分,会列出备份完成的备份集。

恢复
按备份点将备份数据恢复至新建实例
- 在备份列表部分,点击从备份点创建实例。

- 选择要恢复的数据库。

- 单击确定后,跳转到克隆实例页面,勾选对应的参数后,点击立即购买,即可将数据按备份集恢复到新的实例。

按时间点将备份数据恢复至新建实例
- 在备份列表部分,点击按时间点创建实例。
- 选择要恢复的时间点和数据库。

- 单击确定后,跳转到克隆实例页面,勾选对应的参数后,点击立即购买,即可将数据按备份集恢复到新的实例。

清理(释放数据库)
- 云数据库 MongoDB资源清理
登录云数据库 MongoDB控制台,单击云数据库 MongoDB实例右侧的更多>退订,单击确定。