第 10 章:MongoDB 入门
学习目标
- 理解 MongoDB 的文档模型
- 安装 MongoDB / 用 Docker 启动
- 掌握 CRUD 操作
- 用 Spring Data MongoDB 集成
一、MongoDB 是什么
MongoDB 是一个文档型 NoSQL 数据库,数据用类似 JSON 的 BSON 格式存储:
json
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "tom",
"age": 20,
"tags": ["java", "redis"],
"address": {
"city": "beijing",
"zip": "100000"
}
}和 MySQL 的对比:
| MySQL | MongoDB |
|---|---|
| Database | Database |
| Table | Collection |
| Row | Document |
| Column | Field |
| JOIN | $lookup(性能差) |
| 事务 | 4.0+ 支持多文档事务 |
| Schema | 灵活(每个 doc 可以字段不同) |
二、为什么选 MongoDB
- Schema 灵活:加字段不用 ALTER TABLE
- 嵌套文档:天然支持树形结构(评论、订单商品)
- 水平扩展:分片集群成熟
- 适合:日志、IoT、用户画像、商品评论
不适合:强事务、复杂 JOIN —— 这些场景还是 MySQL。
三、安装
Docker
bash
docker run -d --name mongo \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=admin123 \
mongo:7验证
bash
docker exec -it mongo mongosh -u admin -p admin123
> db.version()
7.0.x⚠️ 坑 1:MongoDB 6.0 后
mongoshell 改为mongosh,老mongo命令需要装 shell 包。
四、基础 CRUD
4.1 插入
javascript
db.users.insertOne({ name: "tom", age: 20 })
db.users.insertMany([
{ name: "jerry", age: 25 },
{ name: "alice", age: 30 }
])4.2 查询
javascript
// 全部
db.users.find()
// 条件
db.users.find({ age: { $gt: 20 } })
// 投影(只查 name)
db.users.find({ age: 20 }, { name: 1, _id: 0 })
// 排序 + 限制
db.users.find().sort({ age: -1 }).limit(10).skip(20)4.3 更新
javascript
// 更新单个
db.users.updateOne(
{ name: "tom" },
{ $set: { age: 21 } }
)
// 更新多个
db.users.updateMany(
{ age: { $lt: 30 } },
{ $inc: { age: 1 } } // 年龄全部 +1
)⚠️ 坑 2:
updateOne不带$set会直接替换整个文档!只有_id保留。
4.4 删除
javascript
db.users.deleteOne({ name: "tom" })
db.users.deleteMany({ age: { $lt: 18 } })
// ⚠️ 坑 3:db.users.deleteMany({}) 会删所有文档,慎用五、操作符速查
| 操作符 | 含义 | 示例 |
|---|---|---|
$eq / $ne | 等于 / 不等于 | { age: { $eq: 20 } } |
$gt / $gte | 大于 / 大于等于 | { age: { $gte: 20 } } |
$lt / $lte | 小于 / 小于等于 | |
$in / $nin | 在 / 不在集合内 | { status: { $in: ["A", "B"] } } |
$and / $or | 与 / 或 | |
$exists | 字段存在 | { email: { $exists: true } } |
$regex | 正则 | { name: { $regex: "^t" } } |
六、Spring Boot 整合
依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>配置
yaml
spring:
data:
mongodb:
uri: mongodb://admin:admin123@localhost:27017/test实体
java
@Document("users")
@Data
public class User {
@Id
private String id;
@Field("user_name")
private String name; // 映射到 user_name
private Integer age;
@Indexed // 建索引,加速查询
private String email;
}Repository
java
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByAgeGreaterThan(Integer age);
User findByName(String name);
}⚠️ 坑 4:Spring Data MongoDB 默认用类名转小写作 collection 名(
User→users),要改用@Document("xxx")指定。
七、本章小结
| 要点 | 关键 |
|---|---|
| 文档模型 | 灵活 Schema,嵌套结构 |
| 适用场景 | 日志、IoT、评论、用户画像 |
| 不适合 | 强事务、复杂 JOIN |
| CRUD | insertOne / find / updateOne($set) / deleteOne |
| updateOne | 不带 $set 替换整个文档 |
| Spring 整合 | spring-boot-starter-data-mongodb |
@Indexed | 频繁查询字段加索引 |
动手练习
- 用 Docker 启动 MongoDB,mongosh 连接
- 创建
articlescollection,插入 3 篇文档,练习 find / update / delete - 用 Spring Boot 写一个
ArticleRepository,实现按作者查文章
下一章:第 11 章:MongoDB 进阶 →