MongoDB 是什么?

MongoDB 是什么?

文章目录

一、MongoDB 概述

MongoDB 是一个基于分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 语言编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它由 MongoDB Inc.(原 10gen 公司)于 2009 年正式推出,是目前最流行、最成熟的文档型数据库之一。

MongoDB 的名字源于"humongous"(巨大的),寓意其能够处理海量数据。它采用了面向文档的数据模型,将数据存储在类似 JSON 的 BSON(二进制 JSON)文档中,使得数据结构更加灵活自然,非常适合现代应用开发。

二、核心概念与数据模型

MongoDB 的基本逻辑结构层次为:数据库 (Database)集合 (Collection)文档 (Document)

概念 说明 类比 SQL
数据库 (Database) 物理容器,一个 MongoDB 实例可包含多个数据库。 数据库 (Database)
集合 (Collection) 一组文档,相当于关系型数据库中的表,但不强制定义文档结构 表 (Table)
文档 (Document) 一条记录,由键值对组成,使用 BSON 格式(类似 JSON,支持更多数据类型如日期、二进制)。 行 (Row)
字段 (Field) 文档中的键,对应属性。 列 (Column)
嵌入式文档 (Embedded Document) 文档中嵌套另一个文档,实现一对一或一对多关系。 关联表(需 JOIN)
数组 (Array) 支持字段值为数组,可包含普通值或嵌入式文档。 通常需单独表存储

示例文档:

json 复制代码
{
  "_id": ObjectId("5f7b3b2e9d6b5a1a2c3d4e5f"),
  "name": "张三",
  "age": 28,
  "address": {
    "city": "北京",
    "street": "长安街"
  },
  "hobbies": ["读书", "游泳", "编程"],
  "scores": [
    { "subject": "数学", "score": 90 },
    { "subject": "英语", "score": 85 }
  ]
}
  • _id 是每个文档必须的唯一标识,默认自动生成 ObjectId 类型。

三、主要特性

  1. 灵活的模式(Schema-less)

    集合中的文档可以有不同的字段,字段类型也可动态变化,非常适合迭代开发和多变的数据结构。

  2. 高性能

    • 支持内嵌数据,减少关联查询,读写速度快。
    • 提供丰富的索引支持(包括单字段、复合、多键、地理空间、文本索引等),优化查询性能。
    • 支持内存映射存储引擎(WiredTiger),充分利用系统内存。
  3. 高可用性

    通过**副本集(Replica Set)**实现自动故障转移和数据冗余。一个副本集包含多个数据节点(一个主节点、多个从节点),主节点故障时自动选举新主节点,保证服务持续可用。

  4. 水平可扩展性

    通过**分片(Sharding)**将数据分布到多个服务器上,支持海量数据存储和吞吐量扩展。分片基于片键(Shard Key)自动划分数据块,对应用透明。

  5. 丰富的查询语言

    支持 CRUD、聚合管道、地理空间查询、全文检索、MapReduce 等,满足复杂分析需求。

  6. 聚合框架(Aggregation Pipeline)

    提供类似 Unix 管道的数据处理机制,可对文档进行过滤、分组、转换、排序等操作,用于数据分析和报表生成。

  7. GridFS

    用于存储和检索超过 16MB 限制的大文件(如图片、视频),自动将文件分割成块存储。

  8. 多存储引擎

    • WiredTiger(默认):支持文档级并发控制、压缩和检查点。
    • In-Memory:纯内存存储,提供极高吞吐量。
    • 也支持加密存储引擎等。
  9. 强大的生态系统

    支持几乎所有主流编程语言的驱动,提供 MongoDB Compass(图形化管理工具)、Cloud Manager、Atlas(云托管服务)等。

四、架构组件

  • mongod:MongoDB 核心进程,负责数据存储、处理请求。在副本集或分片集群中扮演不同角色。

  • mongos:路由服务,用于分片集群,接收客户端请求,将请求路由到正确的分片,聚合结果返回给客户端。

  • 配置服务器(Config Server):存储分片集群的元数据(分片和块的路由信息)。

  • 副本集(Replica Set):一组 mongod 实例构成的高可用单元,包含一个主节点(Primary)和多个从节点(Secondary)。

  • 分片(Shard):每个分片是一个副本集或单个 mongod,负责存储整体数据的一个子集。

    分片与主从架构如图所示:

五、适用场景

适用场景:

  • 内容管理/博客/CMS:数据结构多变,文档模型直接对应文章、评论等。
  • 实时数据分析/日志系统:高写入吞吐量,聚合框架适合实时计算。
  • 物联网:设备数据量大、格式多样,需要快速写入和查询。
  • 移动应用:后端灵活适应客户端版本迭代,支持 JSON 数据直接存储。
  • 产品目录/用户资料:属性多变,内嵌数组/文档方便存储多值属性。

不适用场景:

  • 高度事务性系统(如金融交易):MongoDB 早期缺乏多文档事务,4.0 版本后支持副本集内多文档 ACID 事务,但性能开销较大,复杂事务仍不如传统关系型数据库。
  • 复杂关联查询 :虽然支持 $lookup 类似左外连接,但频繁关联会影响性能,适合反范式设计。
  • 强一致性要求极高的系统:默认读关注/写关注可调,但分布式环境下可能存在短暂不一致。

六、与关系型数据库(如 MySQL)的对比

维度 MongoDB MySQL
数据模型 文档型(BSON),支持嵌套、数组 关系型,二维表,严格模式
Schema 动态模式,同一集合可存不同结构文档 固定表结构,需预先定义列
查询语言 基于 JSON 的丰富查询语法 SQL
事务 4.0+ 支持多文档 ACID 事务(副本集内),但有限 成熟的事务支持,ACID 特性强
扩展方式 原生水平分片(自动数据分布) 垂直扩展为主,水平需借助中间件
索引 支持各种索引,包括地理空间、文本 标准 B-Tree 索引,支持全文索引(有限)
JOIN 不推荐,通过内嵌或 $lookup 实现 通过 JOIN 实现复杂关联
适用场景 大数据量、高并发、灵活数据结构 传统应用、金融、强一致性需求

七、基本操作示例(以 mongo shell 语法)

javascript 复制代码
// 切换到数据库
use mydb

// 插入一条文档到 users 集合
db.users.insertOne({ name: "李四", age: 30, tags: ["developer"] })

// 插入多条
db.users.insertMany([ { name: "王五", age: 25 }, { name: "赵六", age: 35 } ])

// 查询所有文档
db.users.find()

// 条件查询(年龄大于 30)
db.users.find({ age: { $gt: 30 } })

// 更新文档(设置年龄 + 添加标签)
db.users.updateOne({ name: "李四" }, { $set: { age: 31 }, $push: { tags: "lead" } })

// 删除文档
db.users.deleteOne({ name: "赵六" })

// 聚合管道示例:按年龄分组统计人数
db.users.aggregate([ { $group: { _id: "$age", count: { $sum: 1 } } } ])

八、优缺点总结

优点:

  • 开发效率高:无模式变更痛苦,快速迭代。
  • 扩展性强:分片集群易于横向扩展。
  • 高可用:副本集自动故障转移。
  • 性能优秀:特别是读多写少、海量数据场景。
  • 丰富的查询和索引功能。

缺点:

  • 事务支持较弱(尽管已改进)。
  • 无 JOIN 操作,设计上需要反范式化,可能造成数据冗余。
  • 内存占用较大(依赖内存映射)。
  • 复杂的聚合操作可能性能不佳。

九、版本演进

  • 1.x - 2.x:基础功能,引入分片、副本集。
  • 3.x:WiredTiger 成为默认存储引擎(3.2),支持文档校验、部分索引。
  • 4.x:支持多文档事务(4.0),分布式事务(4.2),增强聚合能力。
  • 5.x - 6.x:进一步优化性能,增加时间序列集合、加密查询、可重试读写等。

十、总结

MongoDB 以其灵活的数据模型、强大的水平扩展能力和易用性,在现代应用开发(尤其是 Web、移动、IoT 和大数据领域)中占据了重要地位。它并非要取代传统关系型数据库,而是提供了一种针对特定场景更优的解决方案。选择 MongoDB 时,需根据业务特性权衡其优缺点,设计合理的数据模型(合理内嵌、引用),才能充分发挥其优势。

相关推荐
学历真的很重要2 小时前
【系统架构师】第三章 数据库系统知识 - 数据库基础到关系代数(详细版)
数据库·学习·职场和发展·系统架构·系统架构师
亓才孓2 小时前
【MyBatis Plus】Wrapper接口
java·开发语言·数据库·spring boot·mybatis
nudt_qxx2 小时前
Ubuntu 26.04 LTS“坚毅浣熊”(Resolute Raccoon) 新特性前瞻
linux·数据库·ubuntu
tianzhiyi1989sq2 小时前
C++工具库之PugiXML使用指南
java·数据库·c++
人道领域2 小时前
MyBatisPlus高效开发实战指南
java·开发语言·数据库
小李独爱秋3 小时前
模拟面试:解释一下数据库的主从复制的原理,或者说:怎么做的数据库的数据同步?
数据库·sql·mysql·面试·职场和发展·职场发展
梵克之泪3 小时前
一次性查找多个文件,批量文件搜索复制高效方案:咕嘎批量文件查找移动存储系统使用指南,告别手动查找
数据库
源码获取_wx:Fegn08953 小时前
计算机毕业设计|基于springboot + vue鲜花销售管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
EverydayJoy^v^3 小时前
Linux Shell 高级编程(1)——grep
数据库