目录
1. MongoDB基础概念
什么是MongoDB?
MongoDB是一个基于文档的NoSQL数据库,它将数据存储为灵活的JSON样式文档,这意味着字段可以因文档而异,数据结构可以随时间变化。
核心概念对比
MongoDB | 关系型数据库 | 说明 |
---|---|---|
Database | Database | 数据库 |
Collection | Table | 集合/表 |
Document | Row | 文档/行 |
Field | Column | 字段/列 |
文档结构示例
{
"_id": ObjectId("..."),
"name": "张三",
"age": 25,
"email": "zhangsan@example.com",
"hobbies": ["读书", "游泳", "编程"],
"address": {
"city": "北京",
"street": "朝阳区"
}
}
2. MongoDB的特点与优势
主要特点
- 文档导向:使用JSON格式存储数据
- 无模式:同一集合中的文档可以有不同的结构
- 高性能:支持索引,查询速度快
- 高可用性:支持副本集
- 水平扩展:支持分片
适用场景
- 内容管理系统
- 实时分析
- 物联网应用
- 移动应用后端
- 大数据处理
3. MongoDB基本操作
基本CRUD操作
插入文档
// 插入单个文档
db.users.insertOne({
name: "张三",
age: 25,
email: "zhangsan@example.com"
})
// 插入多个文档
db.users.insertMany([
{name: "李四", age: 30},
{name: "王五", age: 28}
])
查询文档
// 查询所有文档
db.users.find()
// 条件查询
db.users.find({age: {$gte: 25}})
// 查询单个文档
db.users.findOne({name: "张三"})
更新文档
// 更新单个文档
db.users.updateOne(
{name: "张三"},
{$set: {age: 26}}
)
// 更新多个文档
db.users.updateMany(
{age: {$lt: 30}},
{$inc: {age: 1}}
)
删除文档
// 删除单个文档
db.users.deleteOne({name: "张三"})
// 删除多个文档
db.users.deleteMany({age: {$lt: 18}})
4. Spring Boot集成MongoDB
步骤1:添加依赖
在pom.xml
中添加MongoDB依赖:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Data MongoDB -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
步骤2:配置数据库连接
在application.yml
中配置:
spring:
data:
mongodb:
host: localhost
port: 27017
database: myapp
# 如果有认证
# username: admin
# password: password
5. 实体类定义
基础实体类
package com.example.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.time.LocalDateTime;
import java.util.List;
@Document(collection = "users") // 指定集合名称
public class User {
@Id
private String id; // MongoDB会自动生成ObjectId
@Field("user_name") // 自定义字段名称
private String name;
private Integer age;
private String email;
private List<String> hobbies;
private Address address; // 嵌套对象
private LocalDateTime createTime;
private LocalDateTime updateTime;
// 构造方法
public User() {}
public User(String name, Integer age, String email) {
this.name = name;
this.age = age;
this.email = email;
this.createTime = LocalDateTime.now();
this.updateTime = LocalDateTime.now();
}
// Getter和Setter方法
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) {
this.name = name;
this.updateTime = LocalDateTime.now();
}
public Integer getAge() { return age; }
public void setAge(Integer age) {
this.age = age;
this.updateTime = LocalDateTime.now();
}
public String getEmail() { return email; }
public void setEmail(String email) {
this.email = email;
this.updateTime = LocalDateTime.now();
}
public List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
public LocalDateTime getCreateTime() { return createTime; }
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
public LocalDateTime getUpdateTime() { return updateTime; }
public void setUpdateTime(LocalDateTime updateTime) { this.updateTime = updateTime; }
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
", hobbies=" + hobbies +
", address=" + address +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}';
}
}
嵌套对象类
package com.example.entity;
public class Address {
private String city;
private String street;
private String zipCode;
public Address() {}
public Address(String city, String street, String zipCode) {
this.city = city;
this.street = street;
this.zipCode = zipCode;
}
// Getter和Setter方法
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getStreet() { return street; }
public void setStreet(String street) { this.street = street; }
public String getZipCode() { return zipCode; }
public void setZipCode(String zip