MongoDB
→ 返回 NoSQL
文档型 NoSQL 数据库,以 BSON(二进制 JSON)格式存储数据。Schema 灵活,支持嵌套文档和数组,适合结构多变的业务数据。
核心概念
| MongoDB | 关系型数据库 | 说明 |
|---|
| Database | Database | 数据库 |
| Collection | Table | 集合(表) |
| Document | Row | 文档(行),BSON 格式 |
| Field | Column | 字段 |
_id | Primary Key | 自动生成的唯一标识 |
| Index | Index | 索引 |
CRUD 操作
插入
// 插入单条
db.users.insertOne({ name: "Alice", age: 30, tags: ["admin", "dev"] })
// 批量插入
db.users.insertMany([
{ name: "Bob", age: 25 },
{ name: "Charlie", age: 35 }
])
查询
// 基础查询
db.users.find({ age: { $gte: 25 } })
db.users.findOne({ name: "Alice" })
// 字段投影(1显示,0隐藏)
db.users.find({}, { name: 1, age: 1, _id: 0 })
// 排序、分页
db.users.find().sort({ age: -1 }).skip(0).limit(10)
// 嵌套查询
db.orders.find({ "address.city": "Beijing" })
// 数组查询
db.users.find({ tags: "admin" }) // 包含某元素
db.users.find({ tags: { $all: ["admin", "dev"] } }) // 包含所有
常用查询操作符
| 操作符 | 说明 |
|---|
$eq / $ne | 等于 / 不等于 |
$gt / $gte / $lt / $lte | 大于 / 大于等于 / 小于 / 小于等于 |
$in / $nin | 在列表中 / 不在列表中 |
$and / $or / $not | 逻辑运算 |
$exists | 字段是否存在 |
$regex | 正则匹配 |
$elemMatch | 数组元素匹配 |
更新
// 更新单条
db.users.updateOne(
{ name: "Alice" },
{ $set: { age: 31 }, $push: { tags: "manager" } }
)
// 批量更新
db.users.updateMany({ age: { $lt: 18 } }, { $set: { status: "minor" } })
// 常用更新操作符
// $set 设置字段值
// $unset 删除字段
// $inc 数值递增
// $push 数组追加元素
// $pull 数组删除元素
// $addToSet 数组追加(去重)
// upsert:不存在则插入
db.users.updateOne({ name: "Dave" }, { $set: { age: 28 } }, { upsert: true })
删除
db.users.deleteOne({ name: "Alice" })
db.users.deleteMany({ age: { $lt: 18 } })
聚合管道
db.orders.aggregate([
// 过滤
{ $match: { status: "completed" } },
// 关联(类似 JOIN)
{ $lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "user"
}},
// 展开数组
{ $unwind: "$user" },
// 分组统计
{ $group: {
_id: "$user.name",
totalAmount: { $sum: "$amount" },
orderCount: { $count: {} }
}},
// 排序
{ $sort: { totalAmount: -1 } },
// 限制数量
{ $limit: 10 },
// 重塑输出
{ $project: {
userName: "$_id",
totalAmount: 1,
orderCount: 1,
_id: 0
}}
])
索引
// 单字段索引
db.users.createIndex({ name: 1 }) // 升序
db.users.createIndex({ age: -1 }) // 降序
// 复合索引
db.users.createIndex({ name: 1, age: -1 })
// 唯一索引
db.users.createIndex({ email: 1 }, { unique: true })
// TTL 索引(自动过期)
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
// 文本索引(全文检索)
db.articles.createIndex({ title: "text", content: "text" })
db.articles.find({ $text: { $search: "redis cache" } })
// 查看索引
db.users.getIndexes()
Spring Data MongoDB
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring:
data:
mongodb:
uri: mongodb://localhost:27017/mydb
@Document("users")
public class User {
@Id
private String id;
private String name;
private Integer age;
@Indexed(unique = true)
private String email;
}
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByAgeGreaterThan(int age);
@Query("{ 'name': { $regex: ?0, $options: 'i' } }")
List<User> findByNameLike(String pattern);
}
// MongoTemplate 复杂查询
@Autowired
private MongoTemplate mongoTemplate;
Query query = new Query(Criteria.where("age").gte(25).lte(40));
query.with(Sort.by(Sort.Direction.DESC, "age"));
query.limit(10);
List<User> users = mongoTemplate.find(query, User.class);
与 MySQL 对比
| 维度 | MongoDB | MySQL |
|---|
| 数据模型 | 文档(BSON) | 表(行列) |
| Schema | 灵活,可动态变更 | 固定,需迁移 |
| 关联查询 | $lookup,性能差于 JOIN | JOIN 高效 |
| 事务 | 支持多文档事务(4.0+) | 完整 ACID |
| 扩展方式 | 原生分片 | 分库分表 |
| 适用场景 | 内容管理、日志、IoT | 金融、ERP、强一致性 |
相关文档