MongoDB 作為文檔型 NoSQL 數據庫,以靈活 Schema、高寫入性能著稱。本文對比關係型術語,實戰演示 Java 驅動 CRUD 操作。
| MySQL | MongoDB | 說明 |
|---|---|---|
| database | database (db) | 邏輯命名空間 |
| table | collection | 文檔容器,無固定 Schema |
| row | document | BSON 格式 (二進制 JSON) |
| column | field | 鍵值對,支持嵌套/數組 |
| primary key | _id (ObjectId) | 自動生成 12 字節唯一標識 |
# 啟動服務
mongod
mongo
# CRUD
use test
db.createCollection("user")
db.user.insert({name: "wangxu", age: 27})
db.user.find({name: "wangxu"})
db.user.update({name: "wangxu"}, {$set: {age: 30}})
db.user.remove({name: "wangxu"})
db.user.drop()
import com.mongodb.client.*;
import com.mongodb.MongoClient;
import org.bson.Document;
import java.util.*;
public class MongoQuickStart {
public static void main(String[] args) {
// 1. 建立連接 (無認證)
try (MongoClient client = new MongoClient("localhost", 27017)) {
MongoDatabase db = client.getDatabase("test");
// 2. 獲取/創建集合
MongoCollection coll = db.getCollection("user");
// 3. 批量插入
List docs = Arrays.asList(
new Document("name", "wangxu").append("age", 27),
new Document("name", "wangxu_java").append("age", 27)
);
coll.insertMany(docs);
// 4. 更新 (多文檔)
coll.updateMany(Filters.eq("name", "wangxu"),
new Document("$set", new Document("age", 30)));
// 5. 查詢遍歷
FindIterable iter = coll.find();
try (MongoCursor cursor = iter.iterator()) {
while (cursor.hasNext()) {
Document doc = cursor.next();
System.out.println("name=" + doc.getString("name")
+ ", age=" + doc.getInteger("age"));
}
}
// 6. 刪除
coll.deleteMany(Filters.eq("name", "wangxu_java"));
}
}
}
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;
import static com.mongodb.client.model.Sorts.*;
Document query = and(
eq("status", 1),
gt("age", 18),
in("city", "北京", "上海"),
regex("name", "^張.*")
);
Document update = combine(
set("lastLogin", new Date()),
inc("loginCount", 1),
push("tags", "vip")
);
coll.find(query)
.sort(descending("createTime"))
.limit(20)
.skip(0)
.forEach(doc -> System.out.println(doc.toJson()));
// 連接建立不拋異常 (延遲連接)
MongoClient client = new MongoClient("不存在的主機", 27017); // 不報錯
// 實際操作時才拋出 (多為非檢查異常)
try {
client.getDatabase("test").listCollectionNames().first();
} catch (MongoTimeoutException e) {
// 處理連接超時
}
設計啟示:驅動採用惰性連接,實際操作時才建立網絡連接。異常多為非檢查異常,建議在服務層統一捕獲轉換為業務異常。
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(100) // 連接池大小
.maxWaitTime(120000) // 獲取連接最大等待
.socketTimeout(30000) // Socket 讀寫超時
.connectTimeout(10000) // 建立連接超時
.heartbeatFrequency(10000) // 心跳檢測間隔
.build();
MongoClient client = new MongoClient(
new ServerAddress("host1", 27017),
Arrays.asList(new ServerAddress("host2", 27017)), // 副本集
options
);
MongoDB 文檔模型天然契合 JSON/對象結構,Java 驅動 API 簡潔強大。掌握 Filters/Updates/Sorts 構建器、連接池調優、副本集高可用配置,即可應對大多數生產場景。