目錄
1. MongoDB基礎概念
什么是MongoDB?
核心概念對比
文檔結構示例
2. MongoDB的特點與優勢
主要特點
適用場景
3. MongoDB基本操作
基本CRUD操作
插入文檔
查詢文檔
更新文檔
刪除文檔
4. Spring Boot集成MongoDB
步驟1:添加依賴
步驟2:配置數據庫連接
5. 實體類定義
基礎實體類
嵌套對象類
6. Repository接口
基礎Repository
自定義Repository實現
7. Service層實現
8. Controller層實現
9. 配置文件設置
application.yml完整配置
MongoDB配置類
10. 高級操作
聚合查詢
事務支持
11. 最佳實踐
1. 索引優化
2. 數據驗證
3. 異常處理
12. 常見問題解決
問題1:連接超時
問題2:中文亂碼
問題3:日期格式問題
問題4:大數據量查詢性能問題
問題5:內存溢出
總結
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: localhostport: 27017database: 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 {@Idprivate 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; }@Overridepublic 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