標籤:後台 com 活躍 password 轉換 分頁 程式 har data
1.1連單台mongodb
Mongo mg = newMongo();//預設連本機127.0.0.1 連接埠為27017
Mongo mg = newMongo(ip);//可以指定ip 連接埠預設為27017
Mongo mg = newMongo(ip,port);//也可以指定ip及連接埠號碼
1.2連雙台mongodb
//ip為主機ip地址,port為連接埠號碼,dataBaseName相當於資料庫名
DBAddress left = new DBAddress("ip:port/dataBaseName");
DBAddress right = new DBAddress("ip:port/dataBaseName");
//若一個mongodb出現問題,會自動連另外一台
Mongo mongo = new Mongo(left, right);
1.3連多台mongodb
List<ServerAddress> mongoHostList = newArrayList<ServerAddress>();
mongoHostList.add(newServerAddress("ip",port));
mongoHostList.add(newServerAddress("ip",port));
mongoHostList.add(newServerAddress("ip",port));
Mongo mg = newMongo(mongoHostList);
2.1擷取mongodb的db
dataBaseName相當於關聯式資料庫裡的資料庫名,mongodb中若沒有該資料庫名也不會報錯,預設mongodb會建立這個資料庫名,為空白。
DB db = mg.getDB(dataBaseName); //注意:mongodb區分大小寫,程式中一定要注意
2.2mongodb的db安全認證
若這個時候要想訪問db中的collection(相當於關聯式資料庫裡的表),就必須通過安全認證才可以訪問,否則後台會報您沒有通過安全認證。
//安全認證java代碼 返回true表示通過,false表示沒通過不能進行操作
boolean auth =db.authenticate("userName", "password".toCharArray());
3.1得到mongodb中的db的collection
DBCollection users = db.getCollection(tableName);
參數tableName相當於關聯式資料庫裡的表名,若mongodb中沒有該tableName,預設會建立該tableName,為空白
3.2mongodb中的db的collection自增長主鍵
Mongodb中也像傳統的關聯式資料庫裡表一樣,有主鍵(_id)概念,用來唯一標識他們。當使用者往collection中插入一條新記錄的時候,
如果沒有指定_id屬性,那麼mongodb會自動產生一個ObjectId類型的值,儲存為_id的值。
3.3java對collection進行插入操作
//第一種插入方式
DBObject data1 = newBasicDBObject();
data1.put("cust_Id", "123456");
data1.put("is_Show", 1);
data1.put("start_time", newDate());
users.insert(data1);//等同於users.save(data1);
//第二中插入方式
BasicDBObjectBuilderdata1 =BasicDBObjectBuilder.start().add(...).add(...);
users.insert(data1.get());//等同於users.save(data1.get());
//第三種插入方式
Map<String, Object> data1 = new HashMap<String, Object>();
data1.put(...);
……
users.insert(new BasicDBObject(data1));//等同於users.save(new BasicDBObject(data1)
);
//第四中插入方式
String json = "{‘database‘: ‘mkyongDB‘,‘table‘ : ‘hosting‘," + "‘detail‘ : {‘records‘ : 99, ‘index‘ : ‘vps_index1‘, ‘active‘ :‘true‘}}}";
DBObject data1 = (DBObject)JSON.parse(json);
users.insert(data1);//等同於users.save(data1);
3.4java對collection的查詢操作
====================================
DBObject fields = new BasicDBObject();
fields.put("_id", false);
fields.put("tag", true);
fields.put("tv_sec", true);
DBCursor cur = users.find(query, fields);
可以用來過濾不需要擷取的欄位, 減少IO
====================================
//查詢所有的資料find()
DBCursor cur = users.find(); while(cur.hasNext()){...}
//查詢id大於等於1的記錄,並且只取10條記錄
DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).limit(10);
//查詢id大於等於1的記錄,並按id進行降序-1表示降序,1升序。
DBCursor cur = users.find(new BasicDBObject("_id",newBasicDBObject("$gte",1))).sort(newBasicDBObject("_id",-1));
//查詢id大於等於1的記錄,並跳過前10條記錄顯示 相當於id>10
DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).skip(10);
//查詢id大於等於1的記錄,跳過前10條記錄並且只顯示10條記錄。相當//於分頁功能where id>10 and id<=20
DBCursor cur = users.find(newBasicDBObject("_id", newBasicDBObject("$gte",1))).skip(10).limit(10);
//查詢id大於等於1的所有記錄數 返回int型
users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).count()
//findAndRemove() 查詢_id=30000的資料,並且刪除
users.findAndRemove(newBasicDBObject("_id", 30000));
3.5java對collection的更新操作
查詢id為300的記錄,將cust_Id的值更新為6533615,一定要注意大小寫,以及資料//類型,傳回值為int表示所影響的記錄條數可以用users.findOne(newBasicDBObject("_id",300));查看下,會發現這條記錄//只返回兩個欄位了,分別為_id,cust_Id,別的欄位都刪除了。
users.update(newBasicDBObject("_id",300), newBasicDBObject ("cust_Id","6533615")).getN();
//這種寫法可以實現只更新id為300的cust_Id值為6533615,而不刪除這條記錄的別的字//段屬性
users.update(newBasicDBObject("_id",300), newBasicDBObject("$set",newBasicDBObject("cust_Id","6533615"))).getN();
3.6java對collection的刪除操作
//移除cust_Id為6533615的資料。注意 用remove方法不釋放磁碟空間,
//mongodb只在collection中做了標誌,沒有正在刪除。
users.remove(newBasicDBObject("cust_Id","6533615")).getN();
//移除id>=1的資料
users.remove(newBasicDBObject("_id",new BasicDBObject("$gte",1))).getN();
//移除整個collection,drop也不釋放磁碟空間
users.drop();
本周實驗性地使用上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", newDate());
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=newBasicDBObject();
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也並不感冒,所以它不是很值得使用。
本文為轉載,原地址為:
java下執行mongodb