1. 程式人生 > >java中使用mongo-java-driver.jar操作mongo

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