【MongoDB的基本概念介绍】

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 常见术语对比

SQLMongoDB
表(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 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值