MongoDB的Java驱动使用整理 (转)
MongoDB Java Driver 簡單操作
?
一、Java驅動一致性
?
?MongoDB的Java驅動是線程安全的,對于一般的應用,只要一個Mongo實例即可,Mongo有個內置的連接池(池大小默認為10個)。
?
?對于有大量寫和讀的環(huán)境中,為了確保在一個Session中使用同一個DB時,我們可以用以下方式保證一致性:
?
?DB mdb = mongo.getDB('dbname');
?
?mdb.requestStart();
?//
?// 業(yè)務代碼
?//
?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();
?
三、創(chuàng)建連接
?
?Mongo m = new Mongo();
?Mongo m = new Mongo("localhost");
?Mongo m = new Mongo("localhost", 27017);
?
?DB db = m.getDB("mydb);
?
?注意:事實上,Mongo實例代表了一個數據庫連接池,即使在多線程的環(huán)境中,一個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來創(chuàng)建一個和上面的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
?}
?
?使用一個循環(huán)插入數據:
?
?for(int i = 0; i < 100; i++) {
??coll.insert(new BasicDBObject().append("i", i));
?}
?
?我們注意到,同一個coll,我們完全可以插入不同風格的數據,這就是MongoDB的重要特性“模式自由”。
?
十、統(tǒng)計文檔數
?
?現在我們已經有101份文檔在數據庫中了,現在統(tǒng)計一下看是否正確。
?
?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);
?}
?
十四、創(chuàng)建索引
?
?MongoDB支持索引,并且給一個DBCollection添加索引非常簡單,你只要指明需要創(chuàng)建索引的字段,然后指明其是升序(1)還是降序(-1)即可,比如在"i"上創(chuàng)建升序索引。
?
?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();
?
五、二進制數據
?
?字節(jié)數組(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);
轉載于:https://www.cnblogs.com/qq78292959/p/4089311.html
總結
以上是生活随笔為你收集整理的MongoDB的Java驱动使用整理 (转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四叶草关闭啰嗦模式_利用OCC配置器关闭
- 下一篇: 深入浅出Java回调机制