MongoDB基础知识梳理
简介
- MongoDB 是由 C++ 编写的开源 NoSQL 和基于文档的数据库。MongoDB 提供了面向文档的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常流行的文档类型数据库。
- MongoDB 是非关系型数据库当中功能最丰富,最像关系型数据库的。它支持的数据结构非常松散,会将数据存储为一个文档,数据结构由键值对(key=>value)组成,是类似于json的bson格式,字段值可以包含其它文档、数组和文档数组,因此可以存储比较复杂的数据类型。
- 在高负载的情况下,MongoDB 天然支持水平扩展和高可用,可以很方便地添加更多的节点/实例,以保证服务性能和可用性。在许多场景下,MongoDB 可以用于代替传统的关系型数据库或键/值存储方式,皆在为 Web 应用提供可扩展的高可用高性能数据存储解决方案。
为什么使用MongoDB
以下是一些为什么应该开始使用MongoDB的原因
- 面向文档的–由于MongoDB是NoSQL类型的数据库,它不是以关系类型的格式存储数据,而是将数据存储在文档中。这使得MongoDB非常灵活,可以适应实际的业务环境和需求。
- 临时查询-MongoDB支持按字段,范围查询和正则表达式搜索。可以查询返回文档中的特定字段。
- 索引-可以创建索引以提高MongoDB中的搜索性能。MongoDB文档中的任何字段都可以建立索引。
- 复制-MongoDB可以提供副本集的高可用性。副本集由两个或多个mongo数据库实例组成。每个副本集成员可以随时充当主副本或辅助副本的角色。主副本是与客户端交互并执行所有读/写操作的主服务器。辅助副本使用内置复制维护主数据的副本。当主副本发生故障时,副本集将自动切换到辅助副本,然后它将成为主服务器。
- 负载平衡-MongoDB使用分片的概念,通过在多个MongoDB实例之间拆分数据来水平扩展。MongoDB可以在多台服务器上运行,以平衡负载或复制数据,以便在硬件出现故障时保持系统正常运行。
MongoDB的重要特性
- 查询:它支持临时查询和基于文档的查询。
- 索引支持:文档中的任何字段都可以被索引。
- 复制:它支持主从复制。MongoDB 使用本机应用程序来维护数据的多个副本。防止数据库停机是副本集的功能之一,因为它具有自我修复的分片。
- 多台服务器:数据库可以运行在多台服务器上。在硬件故障的情况下,数据被复制以防止系统发生故障。
- 自动分片:此过程将数据分布在多个称为分片的物理分区中。由于分片,MongoDB 具有自动负载平衡功能。
- MapReduce:它支持MapReduce和灵活的聚合工具。
- 故障处理:在 MongoDB 中,很容易处理故障情况。大量的副本提供了更高的保护和数据可用性,以防止数据库停机,例如机架故障、多台机器故障和数据中心故障,甚至网络分区。
- GridFS:无需使堆栈复杂化,可以存储任何大小的文件。GridFS 功能将文件分成更小的部分并将它们存储为单独的文档。
- 无模式数据库:它是一个用 C++ 编写的无模式数据库。
- 面向文档的存储:它使用 BSON 格式,这是一种类似 JSON 的格式。
- 过程: MongoDB JavaScript 运行良好,因为数据库使用语言而不是过程。
MongoDB 数据类型
- 字符串 -必须是 UTF-8 有效
- Integer -根据服务器存储 32 位或 64 位的数值
- Boolean -存储真/假值
- Double -存储浮点值
- Min/Max keys -将值与最低和最高 BSON 元素进行比较
- Arrays -将数组、列表或多个值存储到一个键中
- Date -以 UNIX 格式存储当前日期或时间
- 时间戳 -用于记录文档的修改或添加
- 对象 -用于嵌入文档
- 对象 ID -存储文档的 ID
- 二进制数据 -用于存储二进制数据
- Null -存储空值
- Symbol -与字符串相同,但主要用于具有特定符号类型的语言
- 代码 -用于将 JavaScript 代码存储到文档中
- Regular expression -存储正则表达式
MySQL与 MongoDB 一些对比
数据库 | MySQL | MongoDB |
---|---|---|
数据库模型 | 关系型 | 非关系型 |
存储方式 | 不同引擎有不同的存储方式 | 以类JSON的文档的格式存储 |
查询语句 | SQL语句 | MongoDB查询方式(类似JavaScript的函数) |
数据处理方式 | 不同引擎有自己的特点 | 基于内存,将热数据存放在物理内存中,从而达到高速读写 |
成熟度 | 成熟度高 | 新兴数据库,成熟度较低 |
广泛度 | 开源数据库,市场份额不断增长 | NoSQL数据库中,比较完善且开源,使用人数在不断增长 |
事务性 | 支持事务操作 | 仅支持单文档事务操作,弱一致性 |
占用空间 | 占用空间小 | 占用空间大 |
join操作 | MySQL支持join | MongoDB没有join |
MySQL与 MongoDB 对应的术语:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB 架构
- 数据库:简单来说,可以称为数据的物理容器。每个数据库在文件系统上都有自己的一组文件,多个数据库存在于单个 MongoDB 服务器上。
- 集合:一组数据库文档可以称为一个集合。RDBMS 相当于一个集合是一个表。整个集合存在于单个数据库中。涉及集合时没有模式。在集合中,各种文档可以有不同的字段,但集合中的文档大多用于相同的目的或服务于相同的最终目标。
- 文档:一组键值对可以指定为一个文档。文档与动态模式相关联。拥有动态模式的好处是单个集合中的文档不必拥有相同的结构或字段。此外,集合文档中的公共字段可以具有不同类型的数据。
MongoDB核心组件及其用法包括:
- 集合 —— 它们是一组 MongoDB 文档。它们的 RDBMS 对应物是表。必须了解集合不强制执行任何结构。集合始终存在于单个数据库中。
- 文档 —— 这是一个以 BSON 格式存储的数据集合。它的 RDBMS 对应物是 Row。MongoDB 中的记录称为文档。MongoDB 中的文档包含字段名称及其对应的值。
- 字段 —— 这是 MongoDB 文档中的单个元素,它包含作为字段和值对的值。在关系数据库中,字段类似于列。简单来说,字段可以称为文档中的名称-值对。
- _id —— 每个 MongoDB 文档都需要这个字段。_id 字段可以等同于关系数据库中的主键。它表示 MongoDB 文档中的唯一实例或值。如果您有意在 MongoDB 中创建一个没有 _id 字段的文档,它将自动生成。
- 游标 —— 这是一个指示查询集合结果的指针。通过游标的帮助,客户端可以检索结果。
- JSON —— 这是一种 JavaScript 表示法。它是纯文本,一种用于表达结构化数据的人类可读格式。数以千计的编程语言支持 JSON。
- 数据库 —— 就像在 RDBMS 中,数据库是表容器,在 MongoDB 中,数据库是集合容器。每个数据库在文件系统上都包含自己的文件集。因此,MongoDB 服务器可以存储多个数据库。
MongoDB 的优势
- 1. 分布式数据平台
- 在地理分布的数据中心和云区域中,MongoDB 可以运行以确保更高级别的可用性和可扩展性。
- 无需停机且无需更改您的应用程序,MongoDB 可在数据量和吞吐量方面进行弹性扩展。
- 该技术为您提供了跨各种数据中心的足够灵活性,并具有良好的一致性。
- 2. 快速迭代开发
- 不断变化的业务需求将不再影响您企业中项目的成功交付。
- 具有动态模式的灵活数据模型,以及强大的 GUI 和命令行工具,使开发人员能够快速构建和发展应用程序。
- 自动配置支持持续集成和交付以实现生产运营。
- RDBMS 的静态关系模式和复杂操作现在已成为过去。
- 3. 灵活的数据模型
- MongoDB 将数据存储在灵活的类 JSON 文档中,这使得数据持久化和合并变得容易。
- 应用程序代码中的对象被映射到文档模型,因此处理数据变得容易。
- 不用说,模式治理控制、数据访问、复杂聚合和丰富的索引功能不会以任何方式受到损害。
- 无需停机,就可以动态修改架构。
- 由于这种灵活性,开发人员无需担心数据操作。
- 4. 降低 TCO(总拥有成本)
- 使用 MongoDB 时,应用程序开发人员可以更好地完成工作。
- 得益于 Atlas Cloud 服务,运营团队也可以出色地完成工作。
- 由于 MongoDB 在商品硬件上运行,因此成本显着降低。
-
5.集成功能集
- 由于分析和数据可视化、事件驱动的流数据管道、文本和地理空间搜索、图形处理、内存性能,人们可以获得各种实时应用程序。
- RDBMS 要实现这一点,需要额外的复杂技术以及单独的集成要求。
MongoDB 的缺点
- 在 MongoDB 中,没有合并表的方法;因此,每次需要使用此功能时,都必须手动完成,导致编码难看且耗时。
- 它使用大量内存,因为它必须为每个文档存储密钥,因为可能存在数据冲突。
- 当您开始使用一项功能时,它会锁定整个数据库,从而导致并发问题。
- 它不会自动执行此操作;因此用户必须手动确保该操作是一个事务。
场景应用
适用场景
- 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
- 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
- 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。
- 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
不适场景
- 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
- 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
- 需要SQL 的问题。
MongoDB的版本号解释
MongoDB的版本号分为3位:主版本.次版本.修订号。
- 主版本(主要版本):当有重大更新时更新主版本号。例如支持WT引擎时主版本号从2升级到3;支持事务功能时从3升级到4;
- 次版本(快速发布):发布新功能时更新次版本号。以奇数次版本号作为开发版,给大家尝鲜用,但不应用于生产环境;以偶数次版本号作为稳定版,适合生产环境使用。这就是为什么大家在下载网站上只看到4.0,4.2,4.4而无法找到4.1,4.3,4.5的原因。
- 修订号(补丁版本):每隔一定时间发布一次,包含近期内所有的bugfix。修订号不做任何功能上的更新,只用于发布bugfix。所以只要主/次版本号一致时,更新修订号可以完全向前兼容。
主/次版本基本上保持一年一次的更新频率,修订号不定期发布。
MongoDB官方下载网站:
安装MongoDB社区版
CentOS7准备环境
[root@MongoDB-01 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@MongoDB-01 ~]# uname -r 3.10.0-1160.83.1.el7.x86_64 [root@MongoDB-01 ~]# systemctl stop firewalld [root@MongoDB-01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux [root@MongoDB-01 ~]# setenforce 0 [root@MongoDB-01 ~]# ntpdate 0.centos.pool.ntp.org [root@MongoDB-01 ~]# yum install net-tools vim wget curl -y
- MongoDB 5.x
创建/etc/yum.repos.d/mongodb-org-5.0.repo文件 [mongodb-org-5.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc # 安装最新稳定版本的 MongoDB # yum install -y mongodb-org ================================================================================================================================================== # 如要安装特定版本的 MongoDB,请单独指定每个组件包并将版本号附加到包名称,例如 yum install -y mongodb-org-5.0.0 mongodb-org-database-5.0.0 mongodb-org-server-5.0.0 mongodb-org-shell-5.0.0 mongodb-org-mongos-5.0.0 mongodb-org-tools-5.0.0 # yum当更新版本可用时升级软件包。为防止意外升级,请固定包。要固定包,请将以下exclude指令添加到您的/etc/yum.conf文件中 exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools ==================================================================================================================================================
- MongoDB 6.x
# 创建/etc/yum.repos.d/mongodb-org-6.0.repo文件 [root@MongoDB-01 ~]# cat /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc # 安装最新稳定版本的 MongoDB [root@MongoDB-01 ~]# yum install -y mongodb-org
================================================================================================================================================== # 如要安装特定版本的 MongoDB,请单独指定每个组件包并将版本号附加到包名称,例如 yum install -y mongodb-org-6.0.0 mongodb-org-database-6.0.0 mongodb-org-server-6.0.0 mongodb-org-mongos-6.0.0 mongodb-org-tools-6.0.0 # yum当更新版本可用时升级软件包。为防止意外升级,请固定包。要固定包,请将以下exclude指令添加到您的/etc/yum.conf文件中 exclude=mongodb-org,mongodb-org-database,mongodb-org-server,mongodb-mongosh,mongodb-org-mongos,mongodb-org-tools ==================================================================================================================================================
[root@MongoDB-01 ~]# rpm -qa | grep mongodb
mongodb-mongosh-1.8.0-1.el8.x86_64 mongodb-org-database-tools-extra-6.0.5-1.el7.x86_64 mongodb-org-mongos-6.0.5-1.el7.x86_64 mongodb-org-database-6.0.5-1.el7.x86_64 mongodb-database-tools-100.7.0-1.x86_64 mongodb-org-tools-6.0.5-1.el7.x86_64 mongodb-org-server-6.0.5-1.el7.x86_64 mongodb-org-6.0.5-1.el7.x86_64 [root@MongoDB-01 ~]# mongod --version db version v6.0.5 Build Info: { "version": "6.0.5", "gitVersion": "c9a99c120371d4d4c52cbb15dac34a36ce8d3b1d", "openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013", "modules": [], "allocator": "tcmalloc", "environment": { "distmod": "rhel70", "distarch": "x86_64", "target_arch": "x86_64" } } # 默认配置文件 [root@MongoDB-01 ~]# grep -Ev "^$|#" /etc/mongod.conf systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log storage: dbPath: /var/lib/mongo journal: enabled: true processManagement: timeZoneInfo: /usr/share/zoneinfo net: port: 27017 # 确保运行MongoDB的用户有权访问 [root@MongoDB-01 ~]# grep mongo /etc/passwd mongod:x:997:996:mongod:/var/lib/mongo:/bin/fals [root@MongoDB-01 ~]# ls -ld /var/log/mongodb/mongod.log /var/lib/mongo drwxr-xr-x 4 mongod mongod 4096 Mar 23 10:24 /var/lib/mongo -rw-r----- 1 mongod mongod 20102 Mar 23 10:24 /var/log/mongodb/mongod.log [root@MongoDB-01 ~]# systemctl start mongod [root@MongoDB-01 ~]# ps aux | grep mongod mongod 1225 14.8 2.3 2659472 93396 ? Ssl 11:54 0:00 /usr/bin/mongod -f /etc/mongod.conf root 1269 0.0 0.0 112808 968 pts/0 S+ 11:54 0:00 grep --color=auto mongod [root@MongoDB-01 ~]# netstat -ntpl | grep mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1225/mongod [root@MongoDB-01 ~]# systemctl enable mongod
- 卸载MongoDB
[root@MongoDB-01 ~]# systemctl stop mongod [root@MongoDB-01 ~]# ps aux | grep mongod root 2129 0.0 0.0 112808 968 pts/0 S+ 12:11 0:00 grep --color=auto mongod [root@MongoDB-01 ~]# yum erase $(rpm -qa | grep mongodb-org) [root@MongoDB-01 ~]# rm -r /var/log/mongodb [root@MongoDB-01 ~]# rm -r /var/lib/mongo
Ubuntu准备环境
root@ubuntu-1804:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.6 LTS Release: 18.04 Codename: bionic root@ubuntu-1804:~# root@ubuntu-1804:~# uname -r 4.15.0-163-generic root@ubuntu-1804:~# ufw disable Firewall stopped and disabled on system startup root@ubuntu-1804:~# ufw status Status: inactive
root@ubuntu-1804:~# apt list --installed | grep mongo
- MongoDB 5.x
# 导入密钥
root@ubuntu-1804:~# apt-get install gnupg root@ubuntu-1804:~# wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add - # 创建/etc/apt/sources.list.d/mongodb-org-5.0.list文件 root@ubuntu-1804:~# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list root@ubuntu-1804:~# apt-get update # 安装最新稳定版本的 MongoDB root@ubuntu-1804:~# apt-get install -y mongodb-org ======================================================================================================================================================================= # 如要安装特定版本的 MongoDB,请单独指定每个组件包并将版本号附加到包名称,例如 sudo apt-get install -y mongodb-org=5.0.0 mongodb-org-database=5.0.0 mongodb-org-server=5.0.0 mongodb-org-shell=5.0.0 mongodb-org-mongos=5.0.0 mongodb-org-tools=5.0.0 # apt-get当更新版本可用时升级软件包。为防止意外升级,请固定包。 root@ubuntu-1804:~# echo "mongodb-org hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-database hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-server hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-shell hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-mongos hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-tools hold" | sudo dpkg --set-selections =======================================================================================================================================================================
- MongoDB 6.x
# 导入密钥 root@ubuntu-1804:~# apt-get install gnupg root@ubuntu-1804:~# wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - OK # 创建/etc/apt/sources.list.d/mongodb-org-5.0.list文件 root@ubuntu-1804:~# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list root@ubuntu-1804:~# apt-get update # 安装最新稳定版的 MongoDB root@ubuntu-1804:~# apt-get install -y mongodb-org ======================================================================================================================================================================= # 如要安装特定版本的 MongoDB,请单独指定每个组件包并将版本号附加到包名称,例如 root@ubuntu-1804:~# apt-get install -y mongodb-org=6.0.0 mongodb-org-database=6.0.0 mongodb-org-server=6.0.0 mongodb-org-mongos=6.0.4 mongodb-org-tools=6.0.0 # apt-get当更新版本可用时升级软件包。为防止意外升级,请固定包。 root@ubuntu-1804:~# echo "mongodb-org hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-database hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-server hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-shell hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-mongos hold" | sudo dpkg --set-selections root@ubuntu-1804:~# echo "mongodb-org-tools hold" | sudo dpkg --set-selections ======================================================================================================================================================================= root@ubuntu-1804:~# mongod --version db version v6.0.5 Build Info: { "version": "6.0.5", "gitVersion": "c9a99c120371d4d4c52cbb15dac34a36ce8d3b1d", "openSSLVersion": "OpenSSL 1.1.1 11 Sep 2018", "modules": [], "allocator": "tcmalloc", "environment": { "distmod": "ubuntu1804", "distarch": "x86_64", "target_arch": "x86_64" } }