认识
一、认识
MongoDB 是一种基于文档(Document-Oriented
)的开源 NoSQL
数据库,它以 JSON/BSON
格式存储数据,具有高性能、可拓展性强、灵活度高等特点,在现代 Web
与移动应用开发中被广泛使用。MongoDB
基于文档存储, 灵活易扩展, 以类似 JSON
的 BSON
(二进制 JSON
)格式保存数据, 对于 Web
前端开发者,熟悉的 JavaScript/JSON
语法可以让数据在前端与后端之间传递非常自然, 文档模式天然适合存储层级结构、嵌套对象等场景,省去了传统关系型数据库中的表设计、字段变更等复杂步骤; MongoDB
高性能,大规模扩展, 擅长写密集型和读多写多场景,支持 水平分片(Sharding) 来扩展数据规模, 内置 Replication
副本集机制,用于高可用和故障转移,保证数据安全与持续服务; MongoDB
具有丰富的索引机制, 除了常规的单字段索引、多字段复合索引,MongoDB
还支持地理位置索引、全文搜索索引等,为各种业务需求提供强力支持。因此, MongoDB
是现代开发中非常重要且常用的 NoSQL
方案,通过文档化的存储、强大的查询与聚合能力以及易扩展性,为前后端快速迭代提供了灵活而高效的支撑。
MongoDB
核心概念: 数据库 Database
: 类似传统的关系型数据库中的数据库,是一个逻辑容器,每个数据库中可以包含多个集合; 集合(Collection
), 相当于关系型数据库中的“表”,用于存储一组文档, 和传统表不同的是,集合没有固定列结构,可以存储不完全相同结构的文档; 文档(Document
), 在集合中存储的单条记录,采用 BSON/JSON
格式。BSON
, Binary JSON
的缩写, MongoDB
在底层用二进制形式来存储 JSON
结构,这样在解析和传输效率上更高,同时支持更多类型(如日期、ObjectId
、Decimal128
等)。
MongoDB
最佳实践:
-
嵌入文档(
Embedded Documents
): 如果两个实体之间是一对一或一对多,且数据规模不会无限增大,往往可以把子文档直接嵌入到父文档中。优点, 查询相关数据时,一次读取就能获得全部信息。缺点, 文档体积过大时可能导致更新开销增高,或命中文档大小限制(默认16MB
)。 -
引用文档(
Referenced Documents
): 如果两实体之间是多对多或子集合的数据规模可能很大,比如一个用户有几万条评论,通常会将评论独立成另一集合,用_id
做引用。优点, 数据冗余少,单个文档不会过大。缺点, 读取需要多次查询或通过$lookup
做联合查询,可能带来性能开销。 -
索引设计: 单字段索引 & 复合索引: 对高频查询字段进行索引,可以极大提高查询效率, 复合索引可同时加速对多个条件的查询。全文搜索索引: 对文本内容做全文检索;支持相对简单的搜索场景。地理位置索引: 如
$geoNear
,$geoWithin
,$geoIntersects
等,用来处理地理位置相关查询(周边搜索等)。 -
性能与扩展: 水平分片(
Sharding
), 当单机容量或读写负载压力过高时,可以配置分片集群,将数据拆分到多台机器上。副本集(Replica Set
), 复制多份相同数据,用于高可用, 当主节点宕机时,自动在剩余节点中选新主。 -
事务支持: 在早期版本中,
MongoDB
只支持单文档级别的 原子操作。从4.0
版本起,开始支持多文档事务(多操作在一个事务中),让其在某些对数据一致性要求较高的场景也能更好地胜任。
MongoDB NoSQL
VS 关系型数据库: MongoDB
无需预先定义固定的表结构, 相较于关系型数据库(如 MySQL
、PostgreSQL
)需要设计表、列、类型等; MongoDB
通过 Sharding
水平扩容更容易, 相较于关系型数据库也能进行分库分表,但方案会更复杂, 但是关系型数据库在处理复杂查询(多表 Join
)时会有成熟优化器和索引方案。关系型数据库对事务支持非常成熟, MongoDB 4.0+
也提供多文档事务,但相对关系型数据库的事务处理仍有差距和开销考量。