Skip to content
第 10 章 ⏱ 11 分钟阅读

第 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 的对比:

MySQLMongoDB
DatabaseDatabase
TableCollection
RowDocument
ColumnField
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 后 mongo shell 改为 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
CRUDinsertOne / find / updateOne($set) / deleteOne
updateOne不带 $set 替换整个文档
Spring 整合spring-boot-starter-data-mongodb
@Indexed频繁查询字段加索引

动手练习 ​

  1. 用 Docker 启动 MongoDB,mongosh 连接
  2. 创建 articles collection,插入 3 篇文档,练习 find / update / delete
  3. 用 Spring Boot 写一个 ArticleRepository,实现按作者查文章

下一章:第 11 章:MongoDB 进阶 →

本站基于 VitePress 构建 · 由 StackHub 团队维护