MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成,类似于JSON对象,字段值可以包含其他文档、数组及文档数组。
特性 | MongoDB | 关系型数据库 |
---|---|---|
数据模型 | 文档模型 | 表格模型 |
数据结构 | 灵活,无模式 | 固定,需要预定义结构 |
查询语言 | JSON风格查询 | SQL |
事务支持 | 4.0版本开始支持 | 完全支持 |
水平扩展 | 原生支持 | 通常需要额外工具 |
复杂关联查询 | 使用$lookup,性能相对较低 | 通过JOIN支持,性能更好 |
适用场景 | 大数据量、高并发、弱事务 | 强事务、复杂查询、结构化数据 |
MongoDB使用BSON(Binary JSON)格式存储数据。BSON扩展了JSON模型,提供了更多的数据类型和更高效的编码解码。
一个典型的MongoDB文档结构如下:
{
"_id": ObjectId("5f8d3b4e9d3b2c8e9c8b4567"),
"name": "张三",
"age": 30,
"email": "[email protected]",
"address": {
"city": "北京",
"postal_code": "100000"
},
"tags": ["开发", "Java", "MongoDB"]
}
// 插入单个文档
db.users.insertOne({
name: "李四",
age: 25,
email: "[email protected]"
});
// 插入多个文档
db.users.insertMany([
{ name: "王五", age: 35, email: "[email protected]" },
{ name: "赵六", age: 28, email: "[email protected]" }
]);
// 查询所有文档
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 });
// 更新单个文档
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: "[email protected]" }
);
// 删除单个文档
db.users.deleteOne({ name: "李四" });
// 删除多个文档
db.users.deleteMany({ age: { $gt: 30 } });
// 删除所有文档
db.users.deleteMany({});
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 });
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是Spring框架的扩展,简化了基于Spring的应用程序开发。它消除了设置Spring应用程序所需的大量样板代码和配置,使开发人员能够快速启动和运行应用程序。
Spring Data MongoDB是Spring Data家族的一部分,专为使用MongoDB数据库的应用程序提供Spring风格的数据访问抽象。它提供了以下功能:
在Spring Boot项目中添加MongoDB依赖非常简单,只需在pom.xml
文件中添加以下依赖:
org.springframework.boot
spring-boot-starter-data-mongodb
或者在Gradle的build.gradle
文件中:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-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
大多数情况下,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 {
@Bean
public MongoClient mongoClient() {
ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/mydatabase");
MongoClientSettings mongoClientSettings &