MongoDB的Java驅動使用整理 (轉)


MongoDB Java Driver 簡單操作
 
一、Java驅動一致性

 

 MongoDB的Java驅動是線程安全的,對於一般的應用,只要一個Mongo實例即可,Mongo有個內置的連接池(池大小默認為10個)。
 
 對於有大量寫和讀的環境中,為了確保在一個Session中使用同一個DB時,我們可以用以下方式保證一致性:
 
 DB mdb = mongo.getDB('dbname');
 
 mdb.requestStart();
 //
 // 業務代碼
 //
 mdb.requestDone();

 

 DB和DBCollection是絕對線程安全的,它們被緩存起來了,所以在應用中取到的可能是同一個對象。

 

二、保存/查找對象(DBObject)

 

 Java驅動提供了DBObject接口,方便我們保存對象到數據庫中。
 
 定義需要保存的對象:
 
 public class Tweet implements DBObject {
  /** ...... */
 }
 
 然后我們可以使用該對象:
 
 Tweet tweet = new Tweet();
 tweet.put("user", userId);
 tweet.put("message", message);
 tweet.put("date", new Date());
 
 collection.insert(tweet);
 
 當從數據庫中查詢時,結果會自動的轉換成DBObject對象,我們可以轉換成我們自己的類型:
 
 collection.setObjectClass(Tweet);
 
 Tweet myTweet = (Tweet)collection.findOne();

 

三、創建連接

 

 Mongo m = new Mongo();
 Mongo m = new Mongo("localhost");
 Mongo m = new Mongo("localhost", 27017);
 
 DB db = m.getDB("mydb);
 
 注意:事實上,Mongo實例代表了一個數據庫連接池,即使在多線程的環境中,一個Mongo實例對我們來說已經足夠了。
 
四、認證(可選的)

 

 boolean auth = db.authenticate("myUserName", "myPasswd");
 
五、取得Collection列表

 

 Set<String> colls = db.getCollectionNames();
 
 for(String s : colls) {
  System.out.prinln(s);
 }

 

六、獲取一個Collection

 

 DBCollection coll = db.getCollection("testCollection");
 
 使用DBCollection,我們可以進行插入、查詢數據等數據操作。

 

七、插入文檔

 

 假設有個JSON文檔如下所示:
 
 {
  "name": "MongoDB",
  "type": "database",
  "count": 1,
  "info": {
     x: 203,
     y: 102
    }
 }
 
 注意:上面的JSON文檔有個內嵌文檔"info"。
 
 我們完全可以利用BasicDBObject來創建一個和上面的JSON一樣的文檔,並且把它保存在MongoDB中。
 
 DBObject doc = new BasicDBObject();
 
 doc.put("name", "MongoDB");
 doc.put("type", "database");
 doc.put("count", 1);
 
 DBObject info = new BasicDBObject();
 info.put("x", 203);
 info.put("y", 102);
 
 doc.put("info", info);
 
 coll.insert(doc);
 
八、查詢第一個文檔(findOne())

 

 為了驗證在上面我們保存的類似JSON的數據,我們可以用findOne()方法取得數據。
 
 findOne(): 返回一個文檔;
 find(): 返回一個游標(DBCursor),其中包含一組對象DBObject;
 
 DBObject doc = coll.findOne();
 System.out.println(doc);
 
 我們將會看到控制台輸出:
 { "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102} , "_ns" : "testCollection"}
 
九、插入多個文檔

 

 為了在后來展示更多的查詢方法,我們先插入幾個文檔,它們的JSON像這樣:
 {
  "i": value
 }
 
 使用一個循環插入數據:
 
 for(int i = 0; i < 100; i++) {
  coll.insert(new BasicDBObject().append("i", i));
 }
 
 我們注意到,同一個coll,我們完全可以插入不同風格的數據,這就是MongoDB的重要特性“模式自由”。
 
十、統計文檔數

 

 現在我們已經有101份文檔在數據庫中了,現在統計一下看是否正確。
 
 long count = coll.getCount();
 System.out.println(count);
 
 控制台將會輸出:101
 
十一、使用游標取得所有的文檔

 

 DBCursor cursor = coll.find();
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
十二、查詢單個文檔

 

 DBObject query = new BasicDBObject();
 
 query.put("i", 71);
 
 cursor = coll.find(query);
 
 while(cur.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
 控制台的輸出類似如下:
 
 { "_id" : "49903677516250c1008d624e" , "i" : 71 , "_ns" : "testCollection"}
 
十三、查詢文檔集合

 

 根據查詢條件,我們可以通過DBCollection從數據庫中取出多個對象,比如查詢i>50的文檔集合:
 
 query = new BasicDBObject();
 
 query.put("i", new BasicDBObject("$gt", 50)); // i>50
 
 cursor = coll.find(query);
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }
 
 比如查詢條件為 20<i<=30:
 
 query = new BasicDBObject();
 
 // 20<i<=30
 query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
 
 cursor = coll.find(query);
 
 while(cursor.hasNext()) {
  DBObject object = cursor.next();
  System.out.println(object);
 }

 

十四、創建索引

 

 MongoDB支持索引,並且給一個DBCollection添加索引非常簡單,你只要指明需要創建索引的字段,然后指明其是升序(1)還是降序(-1)即可,比如在"i"上創建升序索引。
 
 coll.createIndex(new BasicDBObject("i", 1)); // 1代表升序
 
十五、查詢索引

 

 我們可以查詢到所有的索引:
 
 List<DBObject> list = coll.getIndexInfo();
 
 for(DBObject index : list){
  System.out.println(index);
 }
 
 控制台的輸出類似如下所示:
 
 { "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} , "_ns" : "system.indexes"}

 


   MongoDB的管理功能
   
一、獲取所有的數據庫

 

 Mongo m = new Mongo();
 
 for(String s : m.getDatabaseNames()) {
  System.out.println(s);
 }

 

二、刪除數據庫

 

 m.dropDatabase("my_new_db");
 
 
   MongoDB的Java類型

 

一、對象ID

 

 ObjectId被用作自動生成的唯一ID.
 
 ObjectId id = new ObjectId();
 ObjectId copy = new ObjectId(id);
 
二、正則表達式

 

 Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
 DBObject query = new BasicDBObject("name", john);
 
 // 查詢所有 "name" 匹配 /joh?n/i 的文檔
 DBCursor cursor = collection.find(query);

 

三、日期和時間

 

 Date now = new Date();
 DBObject time = new BasicDBObject("ts", now);
 
 collection.save(time);
 
四、數據庫引用

 

 DBRef可以用來保存數據庫引用。
 
 DBRef addressRef = new DBRef(db, "foo.bar", address_id);
 DBObject address = addressRef.fetch();
 
 DBObject person = BasicDBObjectBuilder.start()
  .add("name", "Fred")
  .add("address", addressRef)
  .get();
 collection.save(person);
 
 DBObject fred = collection.findOne();
 DBRef addressObj = (DBRef)fred.get("address");
 addressObj.fetch();
 
五、二進制數據

 

 字節數組(byte[])被當作二進制數據。
 
六、內嵌文檔

 

 JSON樣式的數據如下:
 {
  "x": {
   "y": 3
  }
 }
 
 則在MongoDB中,Java表示為:
 
 DBObject y = new BasicDBObject("y", 3);
 DBObject x = new BasicDBObject("x", y);
 
七、數組

 

 任何繼承自List的對象,在MongoDB中,都被當成是數組。
 
 如果想表示如下JSON數據:
 
 {
  "x": [
   1,
   2,
   {"foo": "bar"},
   4
  ]
 }
 
 則在Java中,應該為:
 
 List<Object> x = new ArrayList<Object>();
 x.add(1);
 x.add(2);
 x.add(new BasicDBObject("foo", "bar"));
 x.add(4);
 
 DBObject doc = new BasicDBObject("x", x);
 System.out.println(doc);


免責聲明!

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



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