一、MongoDB简介
1.1 什么是MongoDB?
MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成,类似于JSON对象,字段值可以包含其他文档、数组及文档数组。
1.2 MongoDB的核心特性
- 文档型数据库:数据以BSON(Binary JSON)格式存储
- 灵活的数据模型:无需预定义模式,字段可以动态添加
- 强大的查询语言:支持丰富的查询表达式
- 高性能:支持索引,包括文本搜索和地理空间索引
- 高可用性:通过复制集提供数据冗余和自动故障转移
- 水平扩展:通过分片实现数据分布式存储
- 支持聚合和MapReduce:用于数据处理和分析
1.3 基本概念
- 数据库(Database):MongoDB中多个集合的物理容器
- 集合(Collection):类似于关系数据库中的表
- 文档(Document):类似于关系数据库中的行,使用BSON格式存储
- 字段(Field):类似于关系数据库中的列
- 索引(Index):提高查询效率的数据结构
- 复制集(Replica Set):提供数据冗余和高可用性
- 分片(Sharding):数据分布式存储的方法
1.4 与传统SQL数据库的比较
特性 | MongoDB | 关系型数据库 |
---|---|---|
数据模型 | 文档模型 | 表格模型 |
数据结构 | 灵活,无模式 | 固定,需要预定义结构 |
查询语言 | JSON风格查询 | SQL |
事务支持 | 4.0版本开始支持 | 完全支持 |
水平扩展 | 原生支持 | 通常需要额外工具 |
复杂关联查询 | 使用$lookup,性能相对较低 | 通过JOIN支持,性能更好 |
适用场景 | 大数据量、高并发、弱事务 | 强事务、复杂查询、结构化数据 |
二、MongoDB基础
2.1 文档结构和BSON
MongoDB使用BSON(Binary JSON)格式存储数据。BSON扩展了JSON模型,提供了更多的数据类型和更高效的编码解码。
一个典型的MongoDB文档结构如下:
{"_id": ObjectId("5f8d3b4e9d3b2c8e9c8b4567"),"name": "张三","age": 30,"email": "zhangsan@example.com","address": {"city": "北京","postal_code": "100000"},"tags": ["开发", "Java", "MongoDB"]
}
2.2 MongoDB支持的数据类型
- 字符串:UTF-8字符串
- 整数:32位或64位整数
- 布尔值:true或false
- 双精度浮点数:IEEE 754浮点数
- 数组:值的列表或数组
- 对象:嵌入式文档
- 对象ID:12字节的唯一标识符
- 日期:Unix时间格式(精确到毫秒)
- Null:表示空值或不存在的字段
- 正则表达式:使用JavaScript的正则表达式语法
- 二进制数据:用于存储非UTF-8字符串的二进制数据
- 代码:JavaScript代码
2.3 基本CRUD操作
创建操作(Create)
// 插入单个文档
db.users.insertOne({name: "李四",age: 25,email: "lisi@example.com"
});// 插入多个文档
db.users.insertMany([{ name: "王五", age: 35, email: "wangwu@example.com" },{ name: "赵六", age: 28, email: "zhaoliu@example.com" }
]);
读取操作(Read)
// 查询所有文档
db.users.find();// 条件查询
db.users.find({ age: { $gt: 30 } });// 查询指定字段
db.users.find({}, { name: 1, email: 1, _id: 0 });// 限制结果数量
db.users.find().limit(5);// 排序
db.users.find().sort({ age: -1 });
更新操作(Update)
// 更新单个文档
db.users.updateOne({ name: "李四" },{ $set: { age: 26, "address.city": "上海" } }
);// 更新多个文档
db.users.updateMany({ age: { $lt: 30 } },{ $inc: { age: 1 } }
);// 替换整个文档
db.users.replaceOne({ name: "王五" },{ name: "王五", age: 36, email: "newwangwu@example.com" }
);
删除操作(Delete)
// 删除单个文档
db.users.deleteOne({ name: "李四" });// 删除多个文档
db.users.deleteMany({ age: { $gt: 30 } });// 删除所有文档
db.users.deleteMany({});
2.4 索引
MongoDB支持多种类型的索引,用于提高查询性能。
// 创建单字段索引
db.users.createIndex({ name: 1 }); // 1表示升序,-1表示降序// 创建复合索引
db.users.createIndex({ name: 1, age: -1 });// 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true });// 创建文本索引
db.articles.createIndex({ content: "text" });// 创建地理空间索引
db.places.createIndex({ location: "2dsphere" });// 查看集合上的所有索引
db.users.getIndexes();// 删除索引
db.users.dropIndex({ name: 1 });
2.5 聚合操作
MongoDB提供了强大的聚合框架,用于对数据进行转换和计算。
// 简单的聚合示例:按年龄分组并计算平均值
db.users.aggregate([{ $group: { _id: null, avgAge: { $avg: "$age" } } }
]);// 使用多个聚合管道阶段
db.orders.aggregate([{ $match: { status: "completed" } },{ $group: { _id: "$customer_id", totalAmount: { $sum: "$amount" } } },{ $sort: { totalAmount: -1 } },{ $limit: 5 }
]);// 使用$lookup进行关联查询(类似SQL中的JOIN)
db.orders.aggregate([{$lookup: {from: "customers",localField: "customer_id",foreignField: "_id",as: "customer_info"}}
]);
三、Spring Boot简介
3.1 Spring Boot概述
Spring Boot是Spring框架的扩展,简化了基于Spring的应用程序开发。它消除了设置Spring应用程序所需的大量样板代码和配置,使开发人员能够快速启动和运行应用程序。
3.2 Spring Boot的核心特性
- 自动配置:自动配置Spring应用程序基于类路径上的依赖
- 起步依赖:简化Maven/Gradle配置
- 嵌入式服务器:内嵌Tomcat、Jetty或Undertow
- 生产就绪功能:健康检查、指标、外部化配置
3.3 Spring Data MongoDB
Spring Data MongoDB是Spring Data家族的一部分,专为使用MongoDB数据库的应用程序提供Spring风格的数据访问抽象。它提供了以下功能:
- 基于接口的数据访问层抽象
- 无需编写具体实现的Repository支持
- 基于方法名称的查询构建
- 自定义查询注解支持
- MongoDB原生操作集成
- 地理空间支持
- 基于MongoDB的审计支持
四、Spring Boot整合MongoDB
4.1 项目依赖配置
在Spring Boot项目中添加MongoDB依赖非常简单,只需在pom.xml
文件中添加以下依赖:
<!-- Spring Boot Starter for MongoDB -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
或者在Gradle的build.gradle
文件中:
dependencies {implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
}
4.2 MongoDB连接配置
在Spring Boot的application.properties
或application.yml
文件中配置MongoDB连接信息:
application.properties:
# MongoDB连接配置
spring.data.mongodb.uri=mongodb://localhost:27017/mydatabase# 或者使用详细配置
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=mydatabase
spring.data.mongodb.username=admin
spring.data.mongodb.password=password
spring.data.mongodb.authentication-database=admin
application.yml:
spring:data:mongodb:uri: mongodb://localhost:27017/mydatabase# 或者使用详细配置#host: localhost#port: 27017#database: mydatabase#username: admin#password: password#authentication-database: admin
4.3 配置MongoDB连接工厂
大多数情况下,Spring Boot的自动配置足以满足需求。但如果需要自定义MongoDB配置,可以创建一个配置类:
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;@Configuration
@EnableMongoRepositories(basePackages = "com.example.repository")
public class MongoConfig {@Beanpublic MongoClient mongoClient() {ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/mydatabase");MongoClientSettings mongoClientSettings = Mon