MongoDB

返回 NoSQL

文档型 NoSQL 数据库,以 BSON(二进制 JSON)格式存储数据。Schema 灵活,支持嵌套文档和数组,适合结构多变的业务数据。


核心概念

MongoDB关系型数据库说明
DatabaseDatabase数据库
CollectionTable集合(表)
DocumentRow文档(行),BSON 格式
FieldColumn字段
_idPrimary Key自动生成的唯一标识
IndexIndex索引

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 对比

维度MongoDBMySQL
数据模型文档(BSON)表(行列)
Schema灵活,可动态变更固定,需迁移
关联查询$lookup,性能差于 JOINJOIN 高效
事务支持多文档事务(4.0+)完整 ACID
扩展方式原生分片分库分表
适用场景内容管理、日志、IoT金融、ERP、强一致性

相关文档