MongoDB和Java(3):Java操作MongoB


 

最近花了一些時間學習了下MongoDB數據庫,感覺還是比較全面系統的,涉及了軟件安裝、客戶端操作、安全認證、副本集和分布式集群搭建,以及使用Spring Data連接MongoDB進行數據操作,收獲很大。特此記錄,以備查看。

 

文章目錄:

MongoDB和Java(1):Linux下的MongoDB安裝

MongoDB和Java(2):普通用戶啟動mongod進程

MongoDB和Java(3):Java操作MongoB

MongoDB和Java(4):Spring Data整合MongoDB(XML配置)

MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群

MongoDB和Java(7):MongoDB用戶管理

 

本文記錄如何使用mongodb-driver連接mongodb數據庫,以及進行簡單的增刪改查操作,使用起來還是比較簡單的。

 

源代碼下載
MongoDB和Java學習代碼.zip

 

1、環境和依賴

MongoDB服務器操作系統    CentOS 6.5

MongoDB版本            4.0.2

客戶端操作系統          Windows 7 64位

Eclipse             Luna Service Release 2 (4.4.2)

Maven              3.2.1

JDK                1.8.0_141

 

我們使用mongodb-driver 3.6.4編寫代碼

首先引入依賴

 1 <dependency>
 2     <groupId>junit</groupId>
 3     <artifactId>junit</artifactId>
 4     <version>4.10</version>
 5     <scope>test</scope>
 6 </dependency>
 7 <dependency>
 8     <groupId>org.mongodb</groupId>
 9     <artifactId>mongodb-driver</artifactId>
10     <version>3.6.4</version>
11 </dependency>
12 <dependency>
13     <groupId>ch.qos.logback</groupId>
14     <artifactId>logback-core</artifactId>
15     <version>1.1.7</version>
16 </dependency>
17 <dependency>
18     <groupId>ch.qos.logback</groupId>
19     <artifactId>logback-classic</artifactId>
20     <version>1.1.7</version>
21 </dependency>

 

2、連接MongoDB服務器

 1 MongoClient mongoClient = null;
 2 
 3 try {
 4 
 5     mongoClient = new MongoClient("10.10.12.195", 27017);
 6 
 7     // show dbs
 8     MongoIterable<String> databaseNames = mongoClient.listDatabaseNames();
 9     for (String name : databaseNames) {
10         System.out.println(name);
11     }
12 
13     // 連接test庫
14     MongoDatabase mgdb = mongoClient.getDatabase("test");
15     System.out.println("MongoDatabase inof is: " + mgdb.getName());
16 
17     // show collections
18     MongoIterable<String> names = mgdb.listCollectionNames();
19     for (String name : names) {
20         System.out.println(name);
21     }
22 } catch (Exception e) {
23 } finally {
24     mongoClient.close();
25 }

 

MongoClient是具有內部連接池的MongoDB客戶端。對於大多數應用程序,整個JVM有一個MongoClient對象就可以了。

在示例代碼中使用了傳入IP、端口的構造方法創建了MongoClient對象。

 

以下是等效的,都連接到默認端口上運行的本地數據庫:

1 MongoClient mongoClient1 = new MongoClient();
2 MongoClient mongoClient1 = new MongoClient("localhost");
3 MongoClient mongoClient2 = new MongoClient("localhost", 27017);
4 MongoClient mongoClient4 = new MongoClient(new ServerAddress("localhost"));
5 MongoClient mongoClient5 = new MongoClient(new ServerAddress("localhost"), MongoClientOptions.builder().build());

 

也可以通過將ServerAddress列表傳遞給MongoClient構造函數來連接副本集。例如:

1 MongoClient mongoClient = new MongoClient(Arrays.asList(
2             new ServerAddress("localhost", 27017),
3             new ServerAddress("localhost", 27018),
4             new ServerAddress("localhost", 27019)));

還可以使用相同的構造方法連接到分片群集。MongoClient將自動檢測服務器是否是副本集成員列表或mongos服務器列表。

 

示例代碼中使用了獲取全部數據庫名稱列表和切換數據庫的方法

a. 可以使用getDatabase("test")方法獲取指定數據庫,此方法返回一個MongoDatabase對象即當前數據庫

b. 可以使用listDatabaseNames()獲取全部數據庫

1 // show dbs
2 MongoIterable<String> databaseNames = mongoClient.listDatabaseNames();
3 for (String name : databaseNames) {
4     System.out.println(name);
5 }

 

 

 

3、創建和列出集合

 1 MongoClient mongoClient = null;
 2 
 3 try {
 4 
 5     mongoClient = new MongoClient("10.10.12.195", 27017);
 6 
 7     // 連接test庫
 8     MongoDatabase mgdb = mongoClient.getDatabase("test");
 9 
10     // 創建employee集合
11     mgdb.createCollection("employee");
12     System.out.println("Create collection: employee");
13 
14     // show collections
15     MongoIterable<String> names = mgdb.listCollectionNames();
16     for (String name : names) {
17         System.out.println(name);
18     }
19 
20 } catch (Exception e) {
21 } finally {
22     mongoClient.close();
23 }

 

MongoDatabase類的createCollection("name")可以創建指定名稱的集合

 

MongoDatabase還有一些其他方法,此處列出主要的:

1 MongoCollection<Document> getCollection(String collectionName);
2 MongoIterable<String> listCollectionNames();
3 ListCollectionsIterable<Document> listCollections();
4 void createCollection(String collectionName);
5 void createCollection(String collectionName, CreateCollectionOptions createCollectionOptions);

 

4、文檔的插入、查詢和刪除

 1 MongoClient mongoClient = null;
 2 
 3 try {
 4 
 5     mongoClient = new MongoClient("10.10.12.195", 27017);
 6 
 7     // 連接test庫
 8     MongoDatabase mgdb = mongoClient.getDatabase("test");
 9 
10     // 獲取集合
11     MongoCollection<Document> emps = mgdb.getCollection("employee");
12 
13     // 創建文檔
14     Document document = new Document().append("name", "administrator").append("age", 20);
15 
16     // 插入文檔
17     emps.insertOne(document);
18 
19     // 查詢數據量
20     long rows = emps.count();
21     System.out.println(rows);
22     // 查詢全部數據
23     FindIterable<Document> find = emps.find();
24     for (Document d : find) {
25         Set<String> set = d.keySet();
26         for (String k : set) {
27             System.out.println(k + ": " + d.get(k));
28         }
29     }
30 
31     // 刪除數據
32     emps.deleteMany(new BsonDocument());
33 
34 } catch (Exception e) {
35 } finally {
36     mongoClient.close();
37 }

 

MongoDatabase的getCollection("employee")方法可以獲取指定名稱的集合即MongoCollection<Document>對象

 

調用insertOne方法即可向集合中插入一個文檔Document對象

 

看下文檔的創建,鏈式語法,可以使用append方法向文檔中添加字段和值

Document document = new Document().append("name", "administrator").append("age", 20);

 

MongoCollectionfind()方法可以查詢集合全部數據

1 // 查詢全部數據
2 FindIterable<Document> find = emps.find();
3 for (Document d : find) {
4     Set<String> set = d.keySet();
5     for (String k : set) {
6         System.out.println(k + ": " + d.get(k));
7     }
8 }

 

有一個重載的 find(Bson filter) 可以查詢指定條件的數據,在更新示例中會介紹Bson 的使用方法

 

刪除數據

emps.deleteMany(new BsonDocument());

 

類似find方法,刪除數據時也可以傳入一個Bson對象指定過濾條件

 

5、文檔更新、Bson和Filters工具類

 1 // 獲取集合
 2 MongoCollection<Document> emps = mgdb.getCollection("employee");
 3 
 4 // 創建文檔
 5 Document document = new Document().append("name", "administrator").append("age", 20);
 6 
 7 // 插入文檔
 8 emps.insertOne(document);
 9 
10 // 更新數據
11 emps.updateOne(Filters.eq("name", "administrator"), new Document("$set", new Document("name", "administrator2")));

 

我們此處使用了updateOne方法更新了一條數據,該方法接收兩個參數:第一個參數是Bson對象設置查詢條件;第二個參數是一個文檔對象指定如何更新數據。

 

Bson接口通常用於條件過濾,我們可以使用Filters工具類來快速的構建條件。

 

Filters工具類是一個用於構建查詢過濾器的工廠。使用此類的一種便捷方法是靜態導入其所有方法,允許使用如下:

collection.find(and(eq("x", 1), lt("y", 3)));

 

有很多靜態方法可以使用:

 

6、連接池特性

Mongo實例就是一個數據庫連接池,默認有10個鏈接。沒有必要重新實現這個連接池,但是可以更改配置。所以,項目中最好只存在一個Mongo的實例。
MongoClientOptions.Builder.connectionsPerHost(int)設置每個主機的最大連接數
MongoClientOptions.Builder.threadsAllowedToBlockForConnectionMultiplier(int)設置線程隊列數,與上面connectionsPerHost值相乘的結果就是線程隊列最大值。如果連接線程排滿了隊列就會拋出“Out of semaphores to get db”錯誤
MongoClientOptions.Builder.maxWaitTime(int)設置最大等待連接的線程阻塞時間
MongoClientOptions.Builder.connectTimeout(int)設置連接超時的毫秒。0是默認和無限
MongoClientOptions.Builder.socketTimeout(int)設置socket超時。0是默認和無限

還有很多,詳細在MongoClientOptions類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM