java中使用mongo-java-driver.jar操作mongo
MongoDB為Java提供了非常豐富的API操作,相比關係型資料庫,這種NoSQL本身的資料也有點面向物件的意思,所以對於Java來說,Mongo的資料結構更加友好。
MongoDB在今年做了一次重大升級,版本來到了3.0。
相比之前的版本,這個版本中又很大的變化,相應地,本文中的方法可能在舊的版本中無法使用。
安裝MongoDB Java Driver
使用maven的使用者在pom.xml中使用以下的dependency。
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId >
<version>3.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
建立連線
程式可以通過MongoClient這個類和MongoDB資料庫建立連線。
MongoClient mongoClient = new MongoClient();
// or
MongoClient mongoClient = new MongoClient( "localhost" );
// or
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// or, 連線副本集,MongoClient會自動識別出
MongoClient mongoClient = new MongoClient(
Arrays.asList(new ServerAddress("localhost", 27017 ),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019)));
MongoDatabase database = mongoClient.getDatabase("mydb");
如果mydb不存在的話,那麼Mongo也會給我們新建立一個數據庫。
MongoDatabase的本質就是一個數據庫的連線,而MongoClient是一個Client,所以我們在應用中可能需要多個連線,卻只需要建立一個MongoClient就可以了,MongoClient本身封裝了一個連線池。關於MongoClient,後面再補一篇文章。
獲得集合
在得到連線之後,通過getCollection()方法來獲取,相同地,如果獲取的集合不存在,那麼Mongo會為我們建立這個集合。
MongoCollection<Document> collection = database.getCollection("users");
插入一個文件
在MongoDB中,資料都是以文件的形式存在的,一個集合可以理解成一個“文件鏈”。
在獲得集合之後,程式就可以通過集合來插入一個新的資料了。
在Mongo Java API中,文件對應的類是Document , 文件中間還可以內嵌文件。
比如插入這樣的資料
{
"username" : "whthomas",
"age" : "22",
"location":{
"city" : "hangzhou",
"x" : 100,
"y" : 200
}
}
Document doc = new Document("username","whthomas").append("age", "22").append("location", new Document("city", "hangzhou").append("x", 100).append("y","200"));
collection.insertOne(doc);
如果要插入多個文件。使用insertMany()函式效率會更高一些,這個函式接受一個List< Document >型別。
List<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++) {
documents.add(new Document("i", i));
}
collection.insertMany(documents);
查詢操作
查詢操作資料庫操作中相對比較複雜的操作,在MongoDB中通過集合的find()方法來查詢資料。
find()函式會返回FindIterable,它提供了一個介面給程式操作和控制這個集合。
得到第一條資料
使用first()函式可以得到結果集中的第一條資料,如果沒有找到資料,則返回一個null值。
Document myDoc = collection.find().first();
得到所有資料
通過iterator方法將FindIterable物件轉換成一個MongoCursor物件。
MongoCursor<Document> cursor = collection.find().iterator();
try {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
} finally {
cursor.close();
}
條件查詢
MongoDB的Java條件查詢操作,在我看來有些不那麼面向物件,寫起來有點函數語言程式設計的味道。
通過Filters、Sorts和Projections三個類,我們可以完成複雜的查詢操作。
比如程式需要得到一個指定條件的資料
import static com.mongodb.client.model.Filters.*;
Document myDoc = collection.find(eq("i", 71)).first();
往find函式中“傳遞”一個eq函式,得到i為71的資料。
過濾條件函式
|條件|函式|例子 |
|----|----|---|
|等於 |eq()| eq("i",50)|
|大於 |gt()| gt("i",50)|
|小於 |lt()| lt("i",50)|
|大於等於(>=)|gte()| gte("i",50)|
|小於等於(<=) |lte()| lte("i",50)|
|存在 |exists()| exists("i")|
排序操作
對FindIterable物件使用sort函式進行排序。ascending函式表示升序,descending函式表示降序。
collection.find().sort(orderBy(ascending("x", "y"), descending("z")))
過濾欄位
有時候,我們並不需要一條資料中所有的內容,只是需要一部分而已,mongoDB 提供了一個projection方法,解決了這個問題。
collection.find().projection(fields(include("x", "y"), excludeId()))
使用forEach
有時候對不同的集合會有相同的操作,做通用方法是最佳實踐,Mongo對於函式式的程式設計正規化真是充滿了熱情,為我們提供了大量非常“函式式”的方法(在Java這種完全面向物件的語言裡,做到這樣真是不容易)。
我們可以通過forEach函式和Block類完成對集合中每個節點資料的操作。
Block<Document> printBlock = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
collection.find(gt("i", 50)).forEach(printBlock);
更新資料
使用updateOne()函式,更新一條資料,第一個引數選取需要被更新的記錄,第二個引數設定需要被更新的具體資料。
collection.updateOne(eq("i", 10), new Document("$set", new Document("i", 110)));
如果需要更新多條資料,可以使用updateMany函式,這個函式會返回一個UpdateResult類的物件,這個物件裡面儲存了資料更新的結果。
UpdateResult updateResult = collection.updateMany(lt("i", 100),
new Document("$inc", new Document("i", 100)));
刪除資料
通過集合使用deleteOne()方法來刪除指定的資料,如果想要刪除多條資料,使用deleteMany方法來完成操作.
collection.deleteOne(eq("i", 110));
DeleteResult deleteResult = collection.deleteMany(gte("i", 100));
Bulk操作
MongoDB提供了一種稱為Bulk的操作方式,資料不會被立即被持久化到資料庫中,而是等待程式排程,確定合適的時間持久化到資料庫中。
Bulk操作支援有序操作,和無序操作兩種模式。有序操作中資料的的操作,會按照順序操作,一旦發生錯誤,操作就會終止;而無序操作,則不安順序執行,只會報告哪些操作發生了錯誤。
Bulk操作支援增刪改三種操作,對應的model分別是InsertOneModel、UpdateOneModel、DeleteOneModel、ReplaceOneModel。它們都繼承於WriteModel
// 有序操作
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))));
// 無序操作
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))),
new BulkWriteOptions().ordered(false));
文章來源:
http://www.cnblogs.com/whthomas/p/mongo-java-crud.html