對mongodb進行java編程

來源:互聯網
上載者:User

本周實驗性地使用上mongodb,應用情境很簡單,所以現在對mongodb瞭解也不是很深入。本文主要介紹mongodb的java用戶端編程,這方面的內容也很簡單,這裡只是做個總結。不得不說,像mongodb這種介於kv和sql之間的儲存,對很多的互連網應用很合適。mongodb現在的應用案例已經很多,並且社區的活躍度很高(國內也有不少人對其有很深的研究,如果有時間和精力,或許我也會投入一些對mongodb的研究),很值得期待。

言歸正傳,下面總結下使用Java開發mongodb應用的一些點滴。在Java中和mongodb互動的最直接的選擇就是使用MongoDB Java Driver,其是:http://github.com/mongodb/mongo-java-driver/downloads。總的來說,在Java中操作mongodb的API還是很簡潔,下面對其一些常見的使用做些介紹。

1、串連資料庫

和mongodb建立串連的範例程式碼如下:

Mongo m = new Mongo("localhost",27017);DB db = m.getDB("db_test");

儘管這裡獲得了表示mongodb的db_test資料庫連接的對象db,但這時並沒有真正和mongodb建立串連,所以即便這時資料庫沒起來也不會拋出異常,儘管你還是需要catch它的執行個體化過程。mongodb的java driver對串連做了池化處理,所以應用中只需要執行個體化一個Mongo對象即可,對它的操作是安全執行緒的,這對開發使用來說真的是很方便。

2、取得DBCollection

mongodb中的collection在Java中使用DBCollection表示(這是一個抽象類別,儘管你不必需要知道),建立DBCollection執行個體也是一行代碼,和建立DB執行個體一樣,這個操作並不涉及真正的和資料庫之間的通訊。

DBCollection coll = db.getCollection("collection1");

要獲得類似mysql中“show tables”功能,可以使用如下代碼:

Set<String> colls = db.getCollectionNames();for (String s : colls) {    System.out.println(s);}
3、插入文檔

mongodb儲存JSON格式的文檔,而在Java中表示這種資料格式的最簡便的類就是Map了。MongoDB Java Driver中提供的BasicDBObject就是個Map(它繼承自LinkedHashMap並實現DBObject介面),它會將Map中的資料轉換成BSON格式傳輸到mongodb。下面是插入文檔的樣本:

DBCollection coll = db.getCollection("collection1");BasicDBObject doc = new BasicDBObject();doc.put("name", "kafka0102");doc.put("age", 28);doc.put("time", new Date());coll.insert(doc);

mongodb中每個插入的文檔會產生個唯一標識_id。當調用coll.insert(doc);時,driver會檢查其中是否有_id欄位,如果沒有則自動產生ObjectId執行個體來作為_id的值,這個ObjectId由4部分編碼而成:目前時間、機器標識、進程號和自增的整數。
insert函數也支援插入文檔列表:

insert(List<DBObject> list)

而提交操作也有update( DBObject q , DBObject o )、remove( DBObject o )。

4、查詢文檔4.1、findOne

findOne是查詢滿足條件的第一條記錄(不意味著資料庫滿足條件的只有一條記錄),查詢條件使用DBObject表示,樣本如下:

DBCollection coll = db.getCollection("collection1");BasicDBObject cond = new BasicDBObject();cond.put("name", "kafka0102");cond.put("age", 28);DBObject ret = coll.findOne(cond);System.out.println(ret);

返回結果是個DBObject,可以通過get(key)來取值。對於查詢條件,可以通過嵌套多層來表示複雜的格式,比如:

query = new BasicDBObject();        query.put("i", new BasicDBObject("$gt", 50));  // e.g. find all where i > 50
4.2、find

find函數是查詢集合的,它返回的DBCursor是DBObject的迭代器,使用樣本如下:

DBCollection coll = db.getCollection("collection1");BasicDBObject cond = new BasicDBObject();cond.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));DBCursor ret = coll.find(cond);while(ret.hasNext()) {   System.out.println(ret.next());}
5、使用索引

建立索引語句如:coll.createIndex(new BasicDBObject(“i”, 1)); ,其中i表示要索引的欄位,1表示升序(-1表示降序)。可以看到,DBObject成為java用戶端通用的結構表示。查看索引使用DBCollection.getIndexInfo()函數。

6、MongoDB Java Driver的並發性

前面提到,Java MongoDB Driver使用了串連的池化處理,這個串連池預設是保持10個串連,可以通過Option進行修改,在應用中使用Mongo的一個執行個體即可。串連池中的每個串連使用DBPort結構表示(而不是DBCollection),並寄存於DBPortPool中,所以對DBCollection的操作並不意味著使用同一個串連。如果在應用的一次請求過程中,需要保證使用同一個串連,可以使用下面的代碼片斷:

DB db...;db.requestStart();//code....db.requestDone();

在requestStart和requestDone之間使用的串連就不是來自於DBPortPool,而是當前線程中的ThreadLocal結構變數(MyPort中保持了DBPort成員)。

7、其他選擇

儘管Java mongodb driver很不錯,但就像很多人不使用JDBC而使用一些ORM架構,mongodb的java用戶端也有其他的選擇。
1)對POJO和DAO的支援。對於那些熱衷ORM的人來說,Morphia(http://code.google.com/p/morphia/wiki/QuickStart)是個不錯的選擇,它通過在POJO中添加註釋來實現映射,並提供對DAO的CRUD操作的支援。
2)對DSL的支援。Sculptor就是這樣的東西,使用者編寫中立的DSL檔案,Sculptor將其翻譯成代碼。這通常不具有吸引力,除非是多語言的應用,能將DSL翻譯成多種程式設計語言,否則除了增加學習成本,沒什麼收益。
3)對JDBC的支援。mongo-jdbc是這樣的東西,但現在還是實驗性質的。它或許是想親近Java程式員,不過它顯然不能完全相容JDBC,而很多Java程式員對JDBC也並不感冒,所以它不是很值得使用。

=============================== 華麗的終止符 ================================

本文作者:kafka0102
本文連結:http://www.kafka0102.com/2010/07/209.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.