一、MongoDB 核心定义
-
MongoDB 是一款文档型 NoSQL 数据库,由 MongoDB Inc. 开发,采用 C++ 编写
-
摒弃了传统关系型数据库的表结构,以BSON(二进制 JSON) 格式存储数据(兼容 JSON,支持更多数据类型如日期、二进制、正则等)
-
核心特点是「灵活、可扩展、高性能」,适合存储非结构化 / 半结构化数据
二、核心概念(对比关系型数据库)
新手最易混淆的是 MongoDB 与 MySQL 等关系型数据库的概念对应,用表格清晰对比:
| MongoDB 概念 | 关系型数据库(MySQL) | 说明 |
|---|---|---|
| Database | Database | 数据库(逻辑隔离的数据集) |
| Collection | Table | 集合(无需预定义结构的 "表") |
| Document | Row | 文档(一条记录,JSON 格式) |
| Field | Column | 字段(文档中的键值对) |
| Index | Index | 索引(加速查询) |
| _id | Primary Key | 文档唯一标识(自动生成,可自定义) |
核心差异 :MongoDB 的 Collection 无需提前定义字段(schema 自由),同集合的文档可以有不同字段 ,比如一个文档有 name/age,另一个可以有 name/email
三、MongoDB 核心特性
- 灵活的文档模型:无需预定义表结构,适配快速迭代的业务(如电商、社交),新增字段无需修改整个集合
- 高性能 :
- 支持内存映射存储,热数据加载到内存,查询速度快;
- 内置索引(单字段、复合、地理空间、文本索引等),优化查询效率
- 高可扩展性 :
- 水平扩展:通过「分片(Sharding)」将数据分布到多台服务器,解决大数据量存储
- 副本集(Replica Set):实现数据备份、故障自动转移,保证高可用
- 丰富的查询能力:支持类似 SQL 的查询语法,还能实现聚合、地理空间查询、全文检索等
- 事务支持:4.0+ 版本支持多文档事务,4.2+ 支持分布式事务,弥补了早期 NoSQL 事务的短板
四、MongoDB 基本操作(实操篇)
以下是最常用的操作(以 MongoDB Shell 为例,也适配 Python/Java 等驱动),先确保你已安装 MongoDB 并启动服务(mongod 命令),然后进入 Shell(mongo 或 mongosh)
数据库操作
javascript
// 切换/创建数据库(不存在则插入数据时自动创建)
use mydb
// 查看当前数据库
db
// 查看所有数据库
show dbs
// 删除当前数据库
db.dropDatabase()
集合操作
javascript
// 创建集合(可选,插入文档时自动创建)
db.createCollection("users")
// 查看所有集合
show collections
// 删除集合
db.users.drop()
文档操作(核心)
1.插入文档
javascript
// 插入单条
db.users.insertOne({
name: "张三",
age: 25,
email: "zhangsan@test.com",
hobbies: ["篮球", "游戏"],
createTime: new Date()
})
// 插入多条
db.users.insertMany([
{ name: "李四", age: 30, email: "lisi@test.com" },
{ name: "王五", age: 28, email: "wangwu@test.com", isVip: true }
])
2.查询文档
javascript
// 查询所有(建议加 limit,避免数据量过大)
db.users.find() // 原始 BSON 格式
db.users.find().pretty() // 格式化输出
// 条件查询(等于)
db.users.find({ age: 25 }).pretty()
// 条件查询(大于 $gt、小于 $lt、包含 $in 等)
db.users.find({ age: { $gt: 28 } }).pretty() // 年龄>28
db.users.find({ hobbies: { $in: ["篮球"] } }).pretty() // 爱好包含篮球
// 投影(只返回指定字段,_id 默认返回,设为 0 不返回)
db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 }).pretty()
// 排序(1 升序,-1 降序)
db.users.find().sort({ age: -1 }).pretty()
// 分页(skip 跳过,limit 限制条数)
db.users.find().skip(0).limit(2).pretty() // 第1页,每页2条
// 统计数量
db.users.countDocuments({ age: { $gt: 25 } })
3.更新文档
javascript
// 更新单条($set 只修改指定字段,否则覆盖整个文档)
db.users.updateOne(
{ name: "张三" }, // 条件
{ $set: { age: 26, email: "zhangsan_new@test.com" } } // 修改内容
)
// 更新多条
db.users.updateMany(
{ age: { $lt: 30 } },
{ $inc: { age: 1 } } // 年龄+1
)
// 替换文档(慎用,会覆盖除 _id 外的所有字段)
db.users.replaceOne(
{ name: "李四" },
{ name: "李四", age: 31, phone: "13800138000" }
)
4.删除文档
javascript
// 删除单条
db.users.deleteOne({ name: "王五" })
// 删除多条
db.users.deleteMany({ age: { $lt: 30 } })
// 删除所有
db.users.deleteMany({})
索引操作(优化查询)
javascript
// 创建单字段索引(1 升序,-1 降序)
db.users.createIndex({ name: 1 })
// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })
// 查看索引
db.users.getIndexes()
// 删除索引
db.users.dropIndex("name_1") // 索引名(从 getIndexes 查看)
五、MongoDB 典型应用场景
- 大数据量 / 高并发场景:如电商用户行为日志、社交平台动态,MongoDB 高性能读写和水平扩展能力适配这类场景
- 数据结构多变的场景:如 IoT 设备数据(不同设备字段不同)、内容管理系统(文章 / 视频属性差异大),无需修改表结构即可适配
- 地理空间查询场景:如外卖配送、打车软件的 "附近的商家 / 司机",MongoDB 内置地理空间索引,支持高效的位置查询
- 快速迭代的互联网产品:创业公司 / 敏捷开发团队,无需提前设计完整 schema,快速上线并随业务调整数据结构
六、MongoDB 与关系型数据库选型建议
| 选 MongoDB | 选 MySQL/Oracle |
|---|---|
| 数据结构不固定、非结构化 / 半结构化 | 数据结构固定、强事务、强关联(如金融、电商订单) |
| 大数据量、高读写并发 | 数据量适中、需复杂 JOIN 查询 |
| 快速迭代、灵活扩展 | 业务稳定、需严格的 ACID 事务 |
总结
- MongoDB 是文档型 NoSQL 数据库 ,以 BSON 存储数据,核心优势是灵活、高性能、易扩展,无需预定义 schema
- 核心操作围绕「数据库 - 集合 - 文档」三层结构 ,常用 API 包括
insertOne/Many、find、updateOne/Many、deleteOne/Many - 选型时优先看==数据结构是否固定、是否需要强事务 / 关联查询:非结构化 / 高并发选 MongoDB,结构化 / 强事务选关系型数据库==