原文地址:http://keben1983.blog.163.com/blog/static/143638081201010591157929/
該文檔是翻譯自文檔[mongodb-docs-2010-10-24.pdf]的[Java Language Center]章節,根據自己的理解整理而成。
希望能給像我這樣開始接觸的朋友一點協助,同時也做個備忘,因為是剛剛學習,其中的很多功能目前都用不上,以後萬一有什麼功能不太清楚,也可以直接查閱該文檔了。
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);
二、Regex
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);