最近花了一些時間學習了下MongoDB數據庫,感受仍是比較全面系統的,涉及了軟件安裝、客戶端操做、安全認證、副本集和分佈式集羣搭建,以及使用Spring Data鏈接MongoDB進行數據操做,收穫很大。特此記錄,以備查看。html
文章目錄:mongodb
MongoDB和Java(1):Linux下的MongoDB安裝數據庫
MongoDB和Java(2):普通用戶啓動mongod進程安全
MongoDB和Java(3):Java操做MongoB服務器
MongoDB和Java(4):Spring Data整合MongoDB(XML配置)app
MongoDB和Java(5):Spring Data整合MongoDB(註解配置)socket
MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集羣分佈式
本文記錄如何使用mongodb-driver鏈接mongodb數據庫,以及進行簡單的增刪改查操做,使用起來仍是比較簡單的。工具
源代碼下載
MongoDB和Java學習代碼.zip
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>
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 }
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);
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);
MongoCollection的find()方法能夠查詢集合所有數據
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對象指定過濾條件
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)));
有不少靜態方法可使用:
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類