MongoDB 作為當前最流行的 NoSQL 資料庫之一,以其靈活的文檔模型和強大的查詢功能深受開發者喜愛。本文將通過完整的 Java 代碼示例,詳細講解如何使用 Java 驅動程式操作 MongoDB,涵蓋連線配置、基本 CRUD 操作、條件查詢、陣列處理等核心場景。
首先需要引入 MongoDB Java 驅動依賴(本文示例基於 2.x 版本 API)。建立連線時需指定主機地址和端口,預設端口為 27017。連線成功後可獲取資料庫實例,並列出所有集合名稱以驗證連線狀態。
Mongo mongo = new Mongo("172.27.9.104", 27017);
DB db = mongo.getDB("mytestdb");
Set<String> cols = db.getCollectionNames();
for (String s : cols) {
System.out.println(s);
}
MongoDB 使用 BasicDBObject 表示文檔,支援嵌套結構。插入數據後可通過 findOne() 快速驗證,或使用游標遍歷所有文檔。
DBCollection collection = db.getCollection("mytestcoll");
collection.drop(); // 清空舊數據
BasicDBObject doc = new BasicDBObject();
doc.put("from", "blog.ithomer.net");
doc.put("to", "forum.ithomer.net");
doc.put("subject", "ithomer.net");
collection.insert(doc);
DBObject dbobj = collection.findOne();
System.out.println(dbobj);
通過循環批量插入測試數據,演示計數統計、全表掃描、精確匹配、範圍查詢($gte、$lt)等常用操作。範圍查詢構建時需注意運算符嵌套順序。
for (int i = 0; i < 10; i++) {
collection.insert(new BasicDBObject().append("ranking", i));
}
System.out.println("count: " + collection.getCount());
// 全表遍歷
DBCursor cursor = collection.find();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
// 精確查詢 ranking=1
BasicDBObject query = new BasicDBObject("ranking", 1);
cursor = collection.find(query);
// 範圍查詢 5 <= ranking < 9
query = new BasicDBObject("ranking",
new BasicDBObject("$gte", 5).append("$lt", 9));
cursor = collection.find(query);
實際項目中常遇到包含陣列、嵌套對象的複雜文檔。以下示例展示如何解析包含標籤、關鍵字、演員、導演、版權等多維陣列的媒體數據,並關聯映射表獲取整數 ID。
@SuppressWarnings("unchecked")
public static void loadMediaTags(List<MediaEntity> mediaEntityList) {
mediaEntityList.clear();
try {
Mongo mongo = new Mongo(CosineCluster.gMongo_HOST, CosineCluster.gMongo_PORT);
DB db = mongo.getDB(CosineCluster.gMongo_DB);
DBCollection collection = db.getCollection(CosineCluster.gMongo_Coll_Media);
DBCursor cursor = collection.find();
int index = 0;
long startTime = System.currentTimeMillis();
while(cursor.hasNext()){
BasicDBObject obj = (BasicDBObject) cursor.next();
long id = obj.getLong("_id");
ArrayList<String> tagList = (ArrayList<String>) obj.get("tag");
ArrayList<String> keywordList = (ArrayList<String>)obj.get("keyword");
ArrayList<Integer> copyrightList = (ArrayList<Integer>)obj.get("copyright");
MediaEntity mediaEntity = new MediaEntity();
mediaEntity.setId(id);
// 處理標籤陣列
for(int j=0; j 100) break;
System.out.println(index + " --- mediaEntity : " + mediaEntity.toString());
}
long costTime = System.currentTimeMillis() - startTime;
System.out.println("load data costTime = " + index + "; costTime = " + costTime/1000f);
} catch (Exception e) {
e.printStackTrace();
}
}
注意:示例中的 getTagInt、getActorInt 等方法每次查詢都會建立新連線,生產環境強烈建議使用連線池並批量查詢映射關係,避免頻繁建立連線造成效能瓶頸。
程式執行後將輸出集合名稱、插入文檔詳情、總筆數、全表數據、精確查詢結果、範圍查詢結果等完整日誌,便於驗證各操作正確性。