阿里云特性

image-20230622142013329

image-20230622142125143

image-20230622142234416

image-20230622142337415

image-20230622142416539

image-20230622142443072

MongoDB适合场景

传统的关系型数据库(MySQL),在数据的“三高”需求以及web2.0网站的需求,力不从心。

三高需求:

  • 高并发
  • 高访问
  • 高可扩展性&&高可用性

具体的应用场景:

  • 社交场景:存储用户信息,以及用户发表的朋友圈,通过地理位置索引实现附近的人

  • 物流场景:使用MongoDB存储订单信息,订单信息在运输工程中会不断更新

  • 游戏场景,业务快速增长,数据结构动态变更

  • 自动驾驶

  • 物联网设备

  • 视频直播,存储用户信息,点赞互动等

上面的应用场景,数据操作方面的共同特点:

  1. 数据量大
  2. 读写操作频繁
  3. 价值较低的数据,对于事务性要求不高

MongoDB简介

MongoDB是一个开源,高性能,无模式的文档型数据库,当初的设计就是为了简化开发和方便扩展,是最像关系型数据库的非关系型数据库。

它支持的数据结构非常松散,是一种类似于JSON格式的BSON,所以可以存储比较复杂的数据类型,又相当灵活。

MongoDB中的记录是一个文档,由字段和值对(filed:value)组成的数据结构。MongoDB的文档类似json,一个文档就认为是一个对象。

体系结构

image-20230622151354641

image-20230622151442226

MongoDB原理介绍

MongoDB的存储引擎:WireTiger

image-20230623094539667

image-20230623094900600

image-20230623095022602

image-20230623153141791

MongoDB开发

准备:公共数据集;github源码;mongoDB compass

利用MongoDB构建一个UFO观测记录网站。

  1. 下载公共数据集(https://www.kaggle.com/datasets/NUFORC/ufo-sightings?select=scrubbed.csv)

  2. 下载MongoDB compass(MongoDB Compass Download (GUI) | MongoDB)

  3. 构建MongoDB数据库和表,并导入数据。

  4. 下载github源码,构建虚拟环境(https://github.com/getsendy/UFO-Spotter/tree/codespace-getsendy-ufo-spotter)

  5. 修改代码,运行运用。

功能:

可以选择城市,查询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

image-20230622180216964

我复制的地址是:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz

使用wgetwget 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安装

  1. 下载安装包

可以选择在官网下载好安装包

或者wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.2.tgz

查看下载好的安装包ls

image-20230622163753073

  1. 解压并将目录重命名为mongodb
1
2
3
tar -zxf mongodb-linux-x86_64-rhel80-6.0.2.tgz 
ls
mv mongodb-linux-x86_64-rhel80-6.0.2 mongodb
  1. 进入安装包目录
1
cd mongodb

image-20230622163956967

其中,bin 目录存放数据库提供的命令

image-20230622164021179

MongoDB Shell 安装

  1. 下载安装包
1
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz
  1. 解压
1
tar -zxf mongosh-1.6.0-linux-x64.tgz  
  1. 重命名解压后的目录
1
mv mongosh-1.6.0-linux-x64.tgz mongosh

mongosh/bin 目录下提供了 mongosh 命令用于连接到 MongoDB 数据库服务

image-20230622164916797

  1. 将 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 最后追加这两个目录,然后保存退出:

image-20230622170611053

然后执行source 命令,重新加载环境变量,使刚才的配置生效

1
source ~/.bash_profile

连接

MongoDB 服务在启动时需要指定数据存储的目录。如果没有指定的话,默认会去找 /data/db/ 目录。

如果数据目录不存在或不可写,那么服务器端将无法启动。因此在启动 MongoDB 服务之前,一定要确保数据目录存在且对该目录有写权限。

先建立两个目录:

1
2
mkdir -p /data/mongodb/data
mkdir -p /data/mongodb/log

使用 mongod 命令启动数据库服务:

1
mongod  --dbpath=/data/mongodb/data
  • –fork:在基于 Unix 的系统中,使用 fork 创建服务器进程,将 MongoDB 服务作为守护进程运行。如果指定了 –fork,则必须同时指定 –logpath。
  • –dbpath:指定存放 MongoDB 数据的目录,启动服务时必须指定。
  • –logpath:默认日志是打印在命令行中的,使用该选项指定日志输出的文件。如果对此目录有写权限且文件不存在,则会自动创建该文件。如果日志文件已经存在,默认会覆盖掉该文件,并删除所有旧的日志。如果希望保留旧的日志,除了使用 –logpath 之外,还应该使用 –logappend 选项。

内容

阿里云MongoDB特色办公

MongoDB官方培训

阿里云云数据库MongoDB实践

先在阿里云创建云数据库MongoDB

登录云数据库MongoDB实例

  1. 先进入MongoDB控制台
  2. 点击左侧的,副本实例列表

image-20230623175026024

  1. 切换资源所在地(选择你购买的所在地)

image-20230623175205574

  1. 副本集实例列表进入实例

image-20230623175348069

image-20230623175412717

  1. 重置密码

image-20230623175545838

  1. 设置白名单

更换成0.0.0.0/0

image-20230623175931034

image-20230623175950090

  1. 登录数据库

image-20230623180321521

8.

在登录实例对话框中,输入数据库账号数据库密码,单击登录。如忘记密码,可以在账号管理页面进行重置密码。(上面有密码重置)

参数说明:

  1. 数据库账号:输入云产品资源中创建的MongoDB数据库账号(我的是root)。
  2. 数据库密码:输入云产品资源中创建的MongoDB数据库密码(你自己设置的)。

创建数据库和用户

  1. 进入数据库管理

image-20230623180718633

然后

image-20230623180816563

  1. 创建数据库

image-20230623180927220

  1. 左侧导航,单击账号管理

  1. 创建用户

  • 目标库:选择刚刚创建的数据库(阿里云的是mymonogdb,我的是daokunn)。
  • 用户名:自定义用户名,本示例为mytest。
  • 密码:自定义密码。
  • 确认密码:再次输入密码。
  • 普通操作角色:勾选read和readWrite
  1. 查看用户
image-20230623181840980

创建集合

集合就是MongoDB文档组,类似于RDBMS(关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着您在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

这里是一些基础语法的学习。

在上面的步奏,我们创建了数据库账号、数据库名称和数据库密码。用这个作为测试。

  1. 进入我们创建的数据库

之后进入以下的界面

image-20230623182431932

  1. 创建一个集合,名称为testcollection,单击执行

语法

1
db.createCollection("testcollection");

image-20230623185514872

文档操作的使用

文档是一组键值(key-value)对(即BSON)。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点。

  1. 插入文档。使用insert()方法插入。
1
db.COLLECTION_NAME.insert(document);

参数说明:

  • COLLECTION_NAME:集合名称。
  • document:要写入的文档内容。

实验中,我们写

1
2
3
4
5
6
7
db.testcollection.insert({title: '阿里云', 
description: '阿里云官网',
by: '阿里云',
url: 'https://www.aliyun.com/',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});

点击确认

执行的结果如下,表示表示已经成功插入一条文档。

img

  1. 查询文档。使用find()方法。
1
db.collection.find(query,projection);

参数说明:

  • query:可选,使用查询操作符指定查询条件。
  • projection:可选,使用投影操作符指定返回的键。查询时如果您需要返回文档中所有键值,只需省略该参数即可(默认省略)。

在SQLConsole中,输入如下SQL,单击执行。

1
db.testcollection.find();

img

在下方执行结果中,您可以看到查询的返回结果。

img

  1. 更新文档。使用方法update()来更新集合中的文档,语法格式如下。
1
2
3
4
5
6
7
8
9
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
);

参数说明:

  • 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阿里云官方网站'}});

img

b. 在执行确认对话框中,单击确认。

img

下方的执行结果中,您可以看到已经成功更新一条文档。

img

c. 在SQLConsole中,输入如下SQL,单击执行。

1
db.testcollection.find();

在下方的执行结果中,您可以看到文档的title已经被更新了。

img

  1. 删除文档。使用deleteMany()方法来删除文档,语法如下。
1
2
3
4
5
6
7
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)

参数说明:

  • filter:表示过滤条件,用于规定一个查询规则,筛选出符合该查询条件的所有文档。删除操作将作用于经过该查询条件筛选之后的文档,类似于关系型数据库的where后面的过滤条件。如果要删除集合中的所有文档,请传入一个空文档({ })。
  • writeConcern:可选参数,写入关注,其值为一个文档。
  • collation:可选参数,指定用于操作的collation。collation允许用户指定特定语言的字符串进行比较规则。

a. 在SQLConsole中,输入如下SQL,单击执行。

1
db.testcollection.deleteMany({ title : "aliyun阿里云官方网站" });

img

b. 在执行确认对话框中,单击确认。

img

在下方的执行结果中,您可以看到已经成功删除一条文档。

img

c. 在SQLConsole中,输入如下SQL,单击执行。

1
db.testcollection.find();

在下方的执行结果中,您可以看到runoob集合中没有文档。

img

MongoDB 条件操作符的使用

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。

MongoDB中条件操作符有:

  • 大于:$gt
  • 小于:$lt
  • 大于等于:$gte
  • 小于等于:$lte
  1. 在SQLConsole中,输入如下三条插入文档SQL,单击执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
db.testcollection.insert({
title: '阿里云官网',
description: '阿里云官方网址。',
by: '阿里云',
url: 'https://www.aliyun.com/',
tags: ['aliyun1'],
likes: 200
});
db.testcollection.insert({title: '帮助中心',
description: '阿里云帮助中心网址。',
by: '阿里云',
url: 'https://help.aliyun.com/',
tags: ['aliyun2'],
likes: 150
});
db.testcollection.insert({title: '体验实验室',
description: '体验实验室网址',
by: '阿里云',
url: 'https://developer.aliyun.com/',
tags: ['aliyun3'],
likes: 100
});

img

  1. 在执行sql过程中,会出现三次执行确认对话框,需要三次单击确认,。

img

下方的执行结果中,您可以看到已经成功插入三条文档。

img

  1. 使用大于操作符($gt)。

在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 大于100的数据,单击执行。

1
db.testcollection.find({likes : {$gt : 100}});

img

执行结果如下。

img

  1. 使用大于等于操作符($gte)。

在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 大于等于100的数据,单击执行。

1
db.testcollection.find({likes : {$gte : 100}});

img

执行结果如下。

img

  1. 使用小于操作符($lt)。

在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 小于150的数据,单击执行。

1
db.testcollection.find({likes : {$lt : 150}});

img

执行结果如下。

img

  1. 使用小于等于操作符($lte)。

在SQLConsole中,输入如下SQL,获取testcollection集合中 “likes” 小于等于150的数据,单击执行。

1
db.testcollection.find({likes : {$lte : 150}});

img

执行结果如下。

img

MongoDB条件操作符$type的使用

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

在SQLConsole中,输入如下SQL,获取testcollection集合中“title”为String的数据,单击执行。

1
db.testcollection.find({"title" : {$type : 'string'}});

img

执行结果如下。

img

MongoDB的limit与skip方法

  1. MongoDB的limit()方法。limit()方法用于MongoDB中读取指定数量的数据。limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

limit()方法基本语法如下所示。

1
db.COLLECTION_NAME.find().limit(NUMBER);

在SQLConsole中,输入如下SQL,查询文档中的两条数据,单击执行。

1
db.testcollection.find().limit(2);

img

执行结果如下。

img

  1. MongoDB的skip()方法。我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
1
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER);

在SQLConsole中,输入如下SQL,查询文档中的指定的一条并跳过一条的数据,单击执行。

1
db.testcollection.find().limit(1).skip(1);

img

执行结果如下。

img

清理

  • 如果您不需要继续使用,请及时清理测试数据和试用资源

  • 云数据库 MongoDB资源清理

登录云数据库 MongoDB控制台,单击云数据库 MongoDB实例右侧的更多>退订,单击确定

img

  • 【重要】如若您通过试用领取的资源:云数据库 MongoDB(3个月内)试用,具有时长限制,使用完请及时清理相关资源。

地址:MongoDB实验地址

阿里云云数据库MongoDB 快速备份恢复

备份

备份有自动备份手动备份两种。

设置自动备份

  1. 在目标实例页面的左侧导航栏,单击备份与恢复,单击全量备份页签,点击备份设置
img
  1. 在备份设置面板,根据业务需求设置以下参数。
  • 全量备份保留天数:设置全量备份数据保留天数,取值范围为7~730天。默认为30天。
  • 备份时间:设置数据备份时间。以小时为单位选择任意时段,建议您将备份时间设置为业务低峰期的某个时段。
  • 星期:设置每周数据备份的频率,默认为7次/周。
  • 日志备份:选择是否需要打开日志备份开关,默认打开。如果后续需要按时间点恢复功能,需要打开日志备份。
  • 日志备份保留天数:当打开日志备份开关时,您需要设置日志备份保留的天数,取值范围为7~730天,默认为7天。
img
  1. 单击确定,完成自动备份设置,后续就会根据设置好的参数进行自动备份。

手动备份

  1. 在目标实例页面的左侧导航栏,单击备份与恢复。
img
  1. 在目标实例页面右上方,单击备份实例。
img
  1. 在备份实例 面板,选择备份方法-快照备份 。
img
  1. 单击确定后,会开启备份,备份完成后,在备份列表部分,会列出备份完成的备份集。
img

恢复

按备份点将备份数据恢复至新建实例

  1. 在备份列表部分,点击从备份点创建实例。
img
  1. 选择要恢复的数据库。
img
  1. 单击确定后,跳转到克隆实例页面,勾选对应的参数后,点击立即购买,即可将数据按备份集恢复到新的实例。
img

按时间点将备份数据恢复至新建实例

  1. 在备份列表部分,点击按时间点创建实例。

img

  1. 选择要恢复的时间点和数据库。
img
  1. 单击确定后,跳转到克隆实例页面,勾选对应的参数后,点击立即购买,即可将数据按备份集恢复到新的实例。
img

清理(释放数据库)

  • 云数据库 MongoDB资源清理

登录云数据库 MongoDB控制台,单击云数据库 MongoDB实例右侧的更多>退订,单击确定

img