Skip to content

这是我学习 MongoDB 时整理的入门笔记。之前写了 MySQL 快速入门,这篇把 MongoDB 补上——两者对比着学,什么时候用哪个就清楚了。

一、MongoDB 是什么

MongoDB 是文档型数据库(NoSQL)——数据不是存在"表/行/列"里,而是存在**集合(Collection)**里,每条数据是一个 文档(Document,JSON 格式)

核心区别一句话:MySQL 的表结构固定(加字段要改表),MongoDB 的每个文档可以长不一样(加字段只影响自己)。

MySQL vs MongoDB:数据模型对比

对比MySQLMongoDB
库/表对应数据库 → 表 → 行/列数据库 → 集合 → 文档
数据结构固定 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 mongosh

MongoDB 的命令行是 mongosh(老版本是 mongo)。

三、核心概念(和 MySQL 对照记)

MySQLMongoDB说明
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/shop
java
@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 快速入门》(缓存中间件)。