MongoDB 是什么
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。
MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常流行的 文档类型数据库 。
在高负载的情况下,MongoDB 天然支持水平扩展和高可用,可以很方便地添加更多的节点/实例,以保证服务性能和可用性。在许多场景下,MongoDB 可以用于代替传统的关系型数据库或键/值存储方式,皆在为 Web 应用提供可扩展的高可用高性能数据存储解决方案。
MongoDB 的存储结构是什么?
MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三个单元组成:
文档(Document):MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成,类似于关系型数据库中的行(Row)。
集合(Collection):一个集合可以包含多个文档,类似于关系型数据库中的表(Table)。
数据库(Database):一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库,类似于关系型数据库中的数据库(Database)。也就是说,MongoDB 将数据记录存储为文档 (更具体来说是BSON 文档(Documents - MongoDB Manual v7.0
format) ),这些文档在集合中聚集在一起,数据库中存储一个或多个文档集合。
SQL 与 MongoDB 常见术语对比:
| SQL | MongoDB |
|---|---|
| 表(Table) | 集合(Collection) |
| 行(Row) | 文档(Document) |
| 列(Col) | 字段(Field) |
| 主键(Primary Key) | 对象ID(Objectid) |
| 索引(Index) | 索引(Index) |
| 嵌套表(Embedded Table) | 嵌入式文档(Embedded Document) |
| 数组(Array) | 数组(Array) |
文档
MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。字段的值可能包括其他文档、数组和文档数组。
文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
- 键不能含有 \0 (空字符)。这个字符用来表示键的结尾。
- . 和 $ 有特别的意义,只有在特定环境下才能使用。
- 以下划线 _ 开头的键是保留的(不是严格要求的)。
BSON [bee·sahn] 是 Binary JSON (JSON) 的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。有关 BSON 规范的内容,可以参考 bsonspec.org (BSON (Binary JSON) Serialization) ,另见BSON 类型 (BSON Types - MongoDB Manual v7.0) 。根据维基百科对 BJSON 的介绍,BJSON 的遍历速度优于 JSON,这也是 MongoDB 选择BSON 的主要原因,但 BJSON 需要更多的存储空间。与 JSON 相比,BSON 着眼于提高存储和扫描效率。BSON 文档中的大型元素以长度字段为前缀以便于扫描。在某些情况下,由于长度前缀和显式数组索引的存在,BSON 使用的空间会多于 JSON。
集合
MongoDB 集合存在于数据库中,*没有固定的结构,*也就是无模式的,这意味着可以往集合插入不同格式和类型的数据。不过,通常情况下,插入集合中的数据都会有一定的关联 性。
集合不需要事先创建,当第一个文档插入或者第一个索引创建时,如果该集合不存在,则会 创建一个新的集合。
集合名可以是满足下列条件的任意UTF-8 字符串:
-
集合名不能是空字符串""。
-
集合名不能含有\0 (空字符),这个字符表示集合名的结尾。
-
集合名不能以"system."开头,这是为系统集合保留的前缀。例如 system.users 这个集 合保存着数据库的用户信息, sys namespaces 集合保存着所有数据库集合的信息。
-
集合名必须以下划线或者字母符号开始,并且不能包含$。
数据库
数据库用于存储所有集合,而集合又用于存储所有文档。 一个MongoDB 中可以创建多个数据库,每一个数据库都有自己的集合和权限。
MongoDB 预留了几个特殊的数据库。
-
admin :admin 数据库主要是保存root用户和角色。例如,system.users 表存储用户,
-
system.roles 表存储角色。 一般不建议用户直接操作这个数据库。将一个用户添加到这个 数据库,且使它拥有admin 库上的名为dbAdminAnyDatabase 的角色权限,这个用户自 动继承所有数据库的权限。 一些特定的服务器端命令也只能从这个数据库运行,比如关 闭服务器。
-
local :local数据库是不会被复制到其他分片的,因此可以用来存储本地单台服务器的任 意collection。一般不建议用户直接使用local库存储任何数据,也不建议进行CRUD 操 作,因为数据无法被正常备份与恢复。
-
config: 当MongoDB 使用分片设置时,config数据库可用来保存分片的相关信息。
-
test : 默认创建的测试库,连接 mongod
(https://mongoing.com/docs/reference/program/mongod.html)服务时,如果不指定连 接的具体数据库,默认就会连接到 test 数据库。
数据库名可以是满足以下条件的任意UTF-8 字符串
MongoDB有什么特点?
数据记录被存储为文档:MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。
模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式,能够用更少的数据对象表现复杂的领域模型对象。
支持多种查询方式:MongoDB 查询 API 支持读写操作 (CRUD)以及数据聚合、文本搜索和地理空间查询。
支持 ACID 事务:NoSQL 数据库通常不支持事务,为了可扩展和高性能进行了权衡。不过,也有例外,MongoDB 就支持事务。与关系型数据库一样,MongoDB 事务同样具有ACID 特性。MongoDB 单文档原生支持原子性,也具备事务的特性。MongoDB 4.0 加入了对多文档事务的支持,但只支持复制集部署模式下的事务,也就是说事务的作用域限制为一个副本集内。MongoDB 4.2 引入了分布式事务,增加了对分片集群上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。
高效的二进制存储:存储在集合中的文档,是以键值对的形式存在的。键用于唯一标识一个文档,一般是 ObjectId 类型,值是以 BSON 形式存在的。BSON = Binary JSON,是在 JSON 基础上加了一些类型及元数据描述的格式。
自带数据压缩功能:存储同样的数据所需的资源更少。
支持 mapreduce:通过分治的方式完成复杂的聚合任务。不过,从 MongoDB 5.0 开始,map-reduce 已经不被官方推荐使用了,替代方案是 聚合管道(Aggregation Pipeline - MongoDB Manual v7.0)。聚合管道提供比 map-reduce 更好的性能和可用性。
支持多种类型的索引:MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
支持 failover:提供自动故障恢复的功能,主节点发生故障时,自动从从节点中选举出一个新的主节点,确保集群的正常使用,这对于客户端来说是无感知的。
支持分片集群:MongoDB 支持集群自动切分数据,让集群存储更多的数据,具备更强的性能。在数据插入和更新时,能够自动路由和存储。
支持存储大文件:MongoDB 的单文档存储空间要求不超过 16MB。对于超过 16MB 的大文件,MongoDB 提供了 GridFS 来进行存储,通过 GridFS,可以将大型数据进行分块处理,然后将这些切分后的小文档保存在数据库中。
MongoDB适合什么应用场景?
MongoDB的优势在于其数据模型和存储引擎的灵活性、架构的可扩展性以及对强大的索引支持。
选用 MongoDB 应该充分考虑 MongoDB 的优势,结合实际项目的需求来决定:
-
随着项目的发展,使用类 JSON 格式(BSON)保存数据是否满足项目需求?MongoDB中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是MongoDB 中的基本数据单元。
-
是否需要大数据量的存储?是否需要快速水平扩展?MongoDB 支持分片集群,可以很方便地添加更多的节点(实例),让集群存储更多的数据,具备更强的性能。
-
是否需要更多类型索引来满足更多应用场景?MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
1570

被折叠的 条评论
为什么被折叠?



