这是我学习 MongoDB 时整理的入门笔记。之前写了 MySQL 快速入门,这篇把 MongoDB 补上——两者对比着学,什么时候用哪个就清楚了。
一、MongoDB 是什么
MongoDB 是文档型数据库(NoSQL)——数据不是存在"表/行/列"里,而是存在**集合(Collection)**里,每条数据是一个 文档(Document,JSON 格式)。
核心区别一句话:MySQL 的表结构固定(加字段要改表),MongoDB 的每个文档可以长不一样(加字段只影响自己)。
| 对比 | MySQL | MongoDB |
|---|---|---|
| 库/表对应 | 数据库 → 表 → 行/列 | 数据库 → 集合 → 文档 |
| 数据结构 | 固定 Schema(列定死) | 灵活 JSON(每文档可不同) |
| 关联查询 | JOIN(强) | 无 JOIN,需嵌入或应用层关联 |
| 事务 | 强 ACID | 支持(4.0+ 文档级事务,弱于 MySQL) |
| 场景 | 强一致、金融、复杂查询 | 快速迭代、灵活结构、日志/JSON 数据 |
二、Docker 安装 + 连接
bash
docker run -d --name mongodb -p 27017:27017 mongo:7
# 连接(mongo shell)
docker exec -it mongodb mongoshMongoDB 的命令行是 mongosh(老版本是 mongo)。
三、核心概念(和 MySQL 对照记)
| MySQL | MongoDB | 说明 |
|---|---|---|
| database(库) | database(库) | 同名 |
| table(表) | collection(集合) | 集合不需要预先建,插入时自动创建 |
| row(行) | document(文档) | 一个 JSON 对象 |
| column(列) | field(字段) | 文档里的 key,可增减 |
| primary key | _id | 自动生成,也可自己指定 |
MongoDB 最省心的点:不用建表——db.user.insertOne(...) 直接插入,集合自动创建。
四、CRUD 实战
js
// 用 shop 库(不存在自动创建)
use shop;
// 增(insertOne 单条 / insertMany 多条)
db.user.insertOne({ name: "BinMaker", age: 35, city: "福州" });
db.user.insertMany([
{ name: "Alice", age: 28, email: "alice@x.com" },
{ name: "Bob", age: 30, hobby: ["篮球", "摄影"] } // 字段可以不同!
]);
// 查(find,返回数组)
db.user.find({ age: { $gt: 25 } }); // 条件查询(age > 25)
db.user.find({ city: "福州" }, { name: 1 }); // 只返回 name 字段(投影)
db.user.find().sort({ age: -1 }).limit(5); // 排序 + 限量
// 改(updateOne / updateMany)
db.user.updateOne({ name: "BinMaker" }, { $set: { city: "厦门" } });
// 删(deleteOne / deleteMany)
db.user.deleteOne({ name: "Bob" });
// 查看集合里有多少条
db.user.countDocuments();常用查询运算符:$gt/$gte/$lt(大小)、$in(在列表中)、$regex(模糊匹配)、$exists(字段是否存在)。
五、索引:和 MySQL 一样的加速原理
js
// 建索引(1=升序)
db.user.createIndex({ age: 1 });
db.user.createIndex({ name: 1, city: 1 }); // 复合索引
// 查执行计划(看有没有走索引)
db.user.find({ age: { $gt: 25 } }).explain("executionStats");索引原理也是 B+Tree,和 MySQL 一致(详见《MySQL 快速入门》的索引一节)。
六、聚合(Aggregate):MongoDB 的"GROUP BY"
MongoDB 没有 SQL 的 GROUP BY,用 聚合管道 实现分组/统计/加工:
js
// 按城市分组,统计每个城市的人数(等价 SQL: SELECT city, COUNT(*) GROUP BY city)
db.user.aggregate([
{ $group: { _id: "$city", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]);聚合管道就是一串处理步骤($match 过滤 → $group 分组 → $sort 排序 → $project 选字段),数据像流水线一样流过每步。
七、Spring Boot 集成
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>yaml
spring:
data:
mongodb:
uri: mongodb://localhost:27017/shopjava
@Document(collection = "user")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String city;
}
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByAgeGreaterThan(int age);
}和 JPA 类似的仓库接口风格,方法名自动生成查询。
小结
- MongoDB = 文档型 NoSQL:集合 + JSON 文档,Schema 灵活、不用建表
- 和 MySQL 对照:集合≈表、文档≈行、字段≈列,主键是 _id
- 查询用方法链 +
$运算符,统计用聚合管道($group 代替 GROUP BY) - 选择:核心业务/强一致用 MySQL,灵活结构/快速迭代用 MongoDB——两者可共存
下一篇可以看我的《MySQL 快速入门》(关系型对照)、《Redis 快速入门》(缓存中间件)。
