MongoDB 是一个基于分布式文件存储的开源 NoSQL 数据库系统,是由 C++ 编写的。MongoDB 是一个文档数据库,旨在简化开发和扩展。在许多场景下,MongoDB 可以用于代替关系型数据库或者键 / 值存储方式,为 Web 应用提供可扩展的高可用高性能数据存储解决方案。
MongoDB 中的记录是一个文档,它是由字段和值对组成的数据结构,MongoDB 文档类似于 JSON 对象,字段的值可以包括其他文档,数组和文档数组。
使用文档的优点是:
MongoDB 数据库将数据存储在集合 collections
中,而不是表 table
。集合包含一个或者多个 BSON 文档。一个 BOSN 文档代表一条记录,而若干纪录组成一个集合 Collection
。数据库中的集合就像这样:
BSON 是一种二进制形式的存储格式,简称 Binary JSON,和 JSON 一样,支持内嵌的文档对象和数组对象。但是 BSON 有 JSON 没有的一些数据类型,比如说 Date 和 BinData 类型。
BSON 采用了类似于 C 语言结构体的名称,具有轻量级、可遍历性、高效性三大特点,可以有效描述非结构化数据和结构化数据,灵活性高,但是空间利用率不是很理想。
BSON 中除了基本的 String
、integer
、Boolean
、double
、null
、array
和 object
,MongoDB 还支持一些特殊的数据类型:date
、object id
、Regular Expression
、JavaScript
、Timestamp
。
对应于关系数据库表,其中的一些概念和术语如下:
表级操作相关的各种 SQL 语句以及相应的 MongoDB 语句如下:
在集合中增加一个新的文档,集合不存在的话,则新建一个。有如下操作:
db.collection.insertOne()
db.collection.insertMany()
在 MongoDB 中,insert
操作的对象都是单个集合,而所有的写操作都是在单个文档级别的原子操作。
查询集合中的文档,也就是查询文档集合。 有如下操作:
db.collection.find()
查询操作可以指定返回文档的查询筛选条件。
修改现有集合中的文档。有如下操作:
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
更新操作是针对单个集合,所有写操作都是单个文档级别的原子操作。更新可以指定筛选条件,和查询条件具有相同语法。
从集合中删除文档。有如下操作:
db.collection.deleteOne()
db.collection.deleteMany()
删除操作是针对单个集合。和改查一样,同样可以指定删除条件,语法和两者相同。
MongoDB 是一种开源文档型数据库管理系统,开发者可以使用它来存储和处理大量的非结构化数据,对比关系型数据库,MongoDB 具有更高的可伸缩性、更好的性能和更灵活的数据类型。
✅ 高可伸缩性:MongoDB 采用了分片技术,可以将数据分散在多台服务器上,从而实现水平扩展。这种方式无需增强单个服务器的性能,就可以满足不断增长的数据存储需求。
✅ 高性能:查询速度快,部分原因是它将数据存储在内存中,还因为采用了多线程和异步 IO 技术,对大量并发请求也能有出色的响应能力。
✅ 灵活的数据类型:采用文档型数据模型,通过嵌套文档和数组,可以灵活的表示数据。
✅ JSON 编码:使用 BSON 格式类存储数据,BSON 上文已经提到,是 JSON 的二进制编码,具有更高的查询速度以及更少的存储空间。MongoDB 支持直接读写 JSON 格式的数据,提供了 JSON 风格的查询语言。
✅ 可扩展性:存储引擎是可插拔式的,可以根据存储需求选择合适的存储引擎。
✅ 自动分片:大型应用所需数据量庞大,MongoDB 可以自动分片,自动分配数据至不同服务器。
✅ 数据备份与恢复:快照和复制技术实现数据备份和恢复。
作为 NoSQL 数据库,MongoDB 可以解决关系型数据库无法解决的 High Performance、Huge Storage、High Scalability && High Availability 问题,分别是对数据库高并发读写的需求、对海量数据的高效率存储和访问的需求、对数据库的高可扩展性和高可用性的需求。
正因为如此,MongoDB 才可以在如下场景中得以应用:
适用于 MongoDB 的场景总结:数据量大、读写操作频繁、数据价值不高,对事务要求不高。