跳到主要内容

认识

2024年04月19日
柏拉文
越努力,越幸运

一、认识


MongoDB 是一种基于文档(Document-Oriented)的开源 NoSQL 数据库,它以 JSON/BSON 格式存储数据,具有高性能、可拓展性强、灵活度高等特点,在现代 Web 与移动应用开发中被广泛使用。MongoDB 基于文档存储, 灵活易扩展, 以类似 JSONBSON(二进制 JSON)格式保存数据, 对于 Web 前端开发者,熟悉的 JavaScript/JSON 语法可以让数据在前端与后端之间传递非常自然, 文档模式天然适合存储层级结构、嵌套对象等场景,省去了传统关系型数据库中的表设计、字段变更等复杂步骤; MongoDB 高性能,大规模扩展, 擅长写密集型和读多写多场景,支持 水平分片(Sharding) 来扩展数据规模, 内置 Replication 副本集机制,用于高可用和故障转移,保证数据安全与持续服务; MongoDB 具有丰富的索引机制, 除了常规的单字段索引、多字段复合索引,MongoDB 还支持地理位置索引、全文搜索索引等,为各种业务需求提供强力支持。因此, MongoDB 是现代开发中非常重要且常用的 NoSQL 方案,通过文档化的存储、强大的查询与聚合能力以及易扩展性,为前后端快速迭代提供了灵活而高效的支撑。

MongoDB 核心概念: 数据库 Database: 类似传统的关系型数据库中的数据库,是一个逻辑容器,每个数据库中可以包含多个集合; 集合(Collection, 相当于关系型数据库中的“表”,用于存储一组文档, 和传统表不同的是,集合没有固定列结构,可以存储不完全相同结构的文档; 文档(Document, 在集合中存储的单条记录,采用 BSON/JSON 格式。BSON, Binary JSON 的缩写, MongoDB 在底层用二进制形式来存储 JSON 结构,这样在解析和传输效率上更高,同时支持更多类型(如日期、ObjectIdDecimal128 等)。

MongoDB 最佳实践:

  1. 嵌入文档(Embedded Documents: 如果两个实体之间是一对一或一对多,且数据规模不会无限增大,往往可以把子文档直接嵌入到父文档中。优点, 查询相关数据时,一次读取就能获得全部信息。缺点, 文档体积过大时可能导致更新开销增高,或命中文档大小限制(默认 16MB)。

  2. 引用文档(Referenced Documents: 如果两实体之间是多对多或子集合的数据规模可能很大,比如一个用户有几万条评论,通常会将评论独立成另一集合,用 _id 做引用。优点, 数据冗余少,单个文档不会过大。缺点, 读取需要多次查询或通过 $lookup 做联合查询,可能带来性能开销。

  3. 索引设计: 单字段索引 & 复合索引: 对高频查询字段进行索引,可以极大提高查询效率, 复合索引可同时加速对多个条件的查询。全文搜索索引: 对文本内容做全文检索;支持相对简单的搜索场景。地理位置索引: 如 $geoNear, $geoWithin, $geoIntersects 等,用来处理地理位置相关查询(周边搜索等)。

  4. 性能与扩展: 水平分片(Sharding, 当单机容量或读写负载压力过高时,可以配置分片集群,将数据拆分到多台机器上。副本集(Replica Set, 复制多份相同数据,用于高可用, 当主节点宕机时,自动在剩余节点中选新主。

  5. 事务支持: 在早期版本中,MongoDB 只支持单文档级别的 原子操作。从 4.0 版本起,开始支持多文档事务(多操作在一个事务中),让其在某些对数据一致性要求较高的场景也能更好地胜任。

MongoDB NoSQL VS 关系型数据库: MongoDB 无需预先定义固定的表结构, 相较于关系型数据库(如 MySQLPostgreSQL)需要设计表、列、类型等; MongoDB 通过 Sharding 水平扩容更容易, 相较于关系型数据库也能进行分库分表,但方案会更复杂, 但是关系型数据库在处理复杂查询(多表 Join)时会有成熟优化器和索引方案。关系型数据库对事务支持非常成熟, MongoDB 4.0+ 也提供多文档事务,但相对关系型数据库的事务处理仍有差距和开销考量。