記錄一下使用mongodb java driver來訪問數據庫的一些總結。
主要是由createMongoInstance()方法完成初始化工作。
- protected static final Mongo mongoInstance = createMongoInstance();
- private static Mongo createMongoInstance() {
- MongoOptions mo = new MongoOptions();
- mo.socketKeepAlive=true;
- mo.autoConnectRetry = true;
- mo.maxAutoConnectRetryTime=10;
- mo.connectionsPerHost = 40;
- mo.connectTimeout = 20 * 1000;
- mo.socketTimeout = 60 * 1000;
- try {
- if (DatabaseProject.DB_CONFIG.containsKey("mongodb.ips")) {
- return new Mongo(getServerAddrsFromConf("mongodb"),mo);
- }
- return new Mongo(new ServerAddress(DatabaseProject.DB_CONFIG.getString("mongodb.ip"), DatabaseProject.DB_CONFIG.getInt("mongodb.port")),mo);
- } catch (Throwable e) {
- DatabaseProject.LOGGER.error("Failed to init mongodb", e);
- throw new ExceptionInInitializerError(e);
- }
- }
其中有一些數據庫配置直接寫在配置文件裏了,在MongoJavaDriverDAO中初始化一部分數據:
- public void insertCollData(){
- //如果該collection不存在則會自動創建
- DBCollection parentcoll = getCollection("ParentColl");
- DBCollection childcoll = getCollection("ChildColl");
- for(int i=0;i<1000;i++){
- DBObject document = new BasicDBObject();
- document.put("intData", 1000+i);
- document.put("longData", System.currentTimeMillis());
- document.put("strData", UUID.randomUUID().toString());
- document.put("doubleData", 1.123+i);
- document.put("createDate", new Date());
- document.put("booleanData", true);
- DBObject innerDoc = new BasicDBObject();
- innerDoc.put("innertype", "string");
- innerDoc.put("innerContent", "string"+i);
- document.put("documentData", innerDoc);
- parentcoll.insert(document);
- DBObject childDocument = new BasicDBObject();
- childDocument.put("parentId", document.get("_id"));
- childDocument.put("createDate", new Date());
- List list = new ArrayList();
- list.add("str" + i%10);
- list.add("str" + i%20);
- list.add(new BasicDBObject("arr"+(i%10),(i%10)));
- list.add(new BasicDBObject("arr"+(i%20),(i%20)));
- childDocument.put("arrays",list);
- childcoll.insert(childDocument);
- }
- System.out.println("ParentColl Count:"+parentcoll.count());
- System.out.println("ChildColl Count:"+childcoll.count());
- }
其中getCollection方法會獲取集合,不存在的話會自動創建一個。getCollection方法如下:
- public static DBCollection getCollection(String collectionName){
- return getDB().getCollection(collectionName);
- }
現在創建了2個集合ParentColl、ChildColl,並初始化了數據。
查詢相關方法:
- /**
- * 查詢全部數據
- */
- public void findColl(){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find();
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- System.out.println("Count:"+coll.count());
- }
- /**
- * 根據ObjectId查詢
- */
- public void findById(String id){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find(new BasicDBObject("_id", new ObjectId(id)));//直接用string查不出來
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * And多條件查詢
- */
- public void findByAndQuery(int intData,long longData){
- coll = getCollection("ParentColl");
- BasicDBObject query = new BasicDBObject();
- query.put("intData", intData);
- query.put("longData", longData);
- System.out.println(coll.findOne(query));
- }
- /**
- * OR多條件查詢
- */
- public void findByORQuery(int lte,int gt,long longData){
- coll = getCollection("ParentColl");
- BasicDBObject query=new BasicDBObject();
- BasicDBObject longdata = new BasicDBObject("longData", longData);
- BasicDBObject intdata = new BasicDBObject("intData", new BasicDBObject().append("$gt", gt).append("$lte",lte));
- BasicDBList cond=new BasicDBList();
- cond.add(longdata);
- cond.add(intdata);
- query.put("$or", cond);
- DBCursor cur = coll.find(query);
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * IN查詢
- */
- public void findByINQuery(int value1,int value2){
- coll = getCollection("ParentColl");
- BasicDBObject query=new BasicDBObject();
- BasicDBList cond=new BasicDBList();
- cond.add(value1);
- cond.add(value2);
- query.put("intData",new BasicDBObject("$in", cond));
- DBCursor cur = coll.find(query);
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * NOT查詢
- */
- public void findByNotQuery(int value1,int value2){
- coll = getCollection("ParentColl");
- BasicDBObject query=new BasicDBObject();
- BasicDBList cond=new BasicDBList();
- cond.add(value1);
- cond.add(value2);
- query.put("intData",new BasicDBObject("$nin", cond));
- System.out.println("Count:"+coll.find(query).count());
- }
- /**
- * 獲取結果集第一條
- */
- public void fetchFirstQuery(int value1,int value2){
- coll = getCollection("ParentColl");
- BasicDBList cond = new BasicDBList();
- cond.add(value1);
- cond.add(value2);
- BasicDBObject query = new BasicDBObject().append("intData",new BasicDBObject("$nin",cond));
- System.out.println(coll.findOne(query));
- }
- /**
- * 查詢文檔部分列
- */
- public void querySomeKey(){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("intData",true));
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 查詢內嵌文檔
- */
- public void queryInnerDocument(){
- coll = getCollection("ParentColl");
- BasicDBObject map = new BasicDBObject();
- map.put("innertype","string");
- map.put("innerContent","string0");
- DBCursor cur = coll.find(new BasicDBObject("documentData",map));
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 查詢內嵌部分文檔
- */
- public void querySubInnerDocument(){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find(new BasicDBObject("documentData.innerContent","string0"));
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 查詢分頁文檔
- */
- public void queryByPage(int skipNum,int pageNum){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find().skip(skipNum).limit(pageNum);
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 查詢文檔某列是否存在
- */
- public void queryExists(){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find(new BasicDBObject("longData",new BasicDBObject("$exists",true)));
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 查詢文檔排序
- */
- public void sortDocument(){
- coll = getCollection("ParentColl");
- DBCursor cur = coll.find().sort(new BasicDBObject("intData",-1));//1:asc / -1:desc
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
補充distinct查詢:
- /**
- * 獲取根據某元素做distinct查詢.
- */
- public void distinctKey(){
- coll = getCollection("ParentColl");
- List<String> list = coll.distinct("documentData.innertype");
- for(String str:list){
- System.out.println(str);
- }
- }
不難發現主要用到BasicDBObject、BasicDBList、DBCursor這三個類。BasicDBObject好比一個map,好比使用json查詢中的{} 。BasicDBList是個list,用於or,nin等條件查詢。DBCursor用於遍歷結果集。其實只要將對應的json查詢使用這3個類轉化一下,就能寫出對應的java代碼了。
更新相關:
- /**
- * 更新文檔1
- */
- public void updateDocument(){
- DB db = getDB();
- //由於mongodb中使用連接池的原因,getLastError()需要再次從連接池中獲取連接.
- //保證update操作和getLastError()使用同一個連接.
- db.requestStart();
- coll = db.getCollection("ParentColl");
- WriteResult result = coll.update(new BasicDBObject("intData",1100),new BasicDBObject("$set", new BasicDBObject("booleanData",false)));
- System.out.println("update count:"+result.getN());
- if(result.getLastError().ok()){//獲取上次操作結果是否有錯誤.
- System.out.println("update document success.");
- }else{
- System.out.println(result.getLastError().getErrorMessage());
- }
- db.requestDone();
- }
- /**
- * 更新文檔2
- */
- public void updateMultiDocument(){
- DB db = getDB();
- db.requestStart();
- coll = db.getCollection("ParentColl");
- //第三個參數:如果沒有該文檔是否創建,第四個參數:是否更新全部匹配條件的文檔.
- WriteResult result = coll.update(new BasicDBObject("booleanData",false),new BasicDBObject("$set", new BasicDBObject("booleanData",true)),false,true);
- System.out.println("update count:"+result.getN());
- if(result.getLastError().ok()){//獲取上次操作結果是否有錯誤.
- System.out.println("update document success.");
- }else{
- System.out.println(result.getLastError().getErrorMessage());
- }
- db.requestDone();
- }
注意requestStart、requestDone方法保證使用同一個數據庫連接。WriteResult記錄更新結果。
索引相關:
- /**
- * 創建唯一索引
- */
- public void createIndexes(){
- coll = getCollection("ParentColl");
- BasicDBObject index = new BasicDBObject();
- index.put("intData",1);//1:asc / -1:desc
- index.put("unique",true);//唯一索引
- coll.createIndex(index);
- }
- /**
- * 查詢索引信息
- */
- public void getIndexes(){
- coll = getCollection("ParentColl");
- List<DBObject> indexInfo = coll.getIndexInfo();
- System.out.println(indexInfo);
- }
- /**
- * 刪除索引信息
- */
- public void dropIndexes(){
- coll = getCollection("ParentColl");
- //刪除的索引必須跟創建的索引名稱\排序\是否唯一都相同才能刪除
- BasicDBObject index = new BasicDBObject();
- index.put("intData",1);
- index.put("unique",true);
- coll.dropIndex(index);
- }
對於文檔可能還會對數組操作:
- /**
- * 取出文檔中的數組
- */
- public void queryArray(){
- coll = getCollection("ChildColl");
- DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("arrays",1));
- while(cur.hasNext()){
- BasicDBObject bo = (BasicDBObject)cur.next();
- List<BasicDBObject> list = (List<BasicDBObject>)bo.get("arrays");
- System.out.println(list.toString());
- }
- }
- /**
- * 查詢數組內是否包含某元素
- */
- public void queryElementInArray(){
- coll = getCollection("ChildColl");
- BasicDBObject query = new BasicDBObject();
- BasicDBObject obj = new BasicDBObject();
- obj.put("arr0",0);
- query.put("arrays", new BasicDBObject("$elemMatch",obj));
- DBCursor cur = coll.find(query);
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * 數組內包含元素的值
- */
- public void queryElementArray(){
- coll = getCollection("ChildColl");
- BasicDBObject obj = new BasicDBObject();
- obj.put("arrays", "str0");
- obj.put("arrays.arr0",0);
- obj.put("arrays.arr10",10);
- DBCursor cur = coll.find(obj);
- while(cur.hasNext()){
- System.out.println(cur.next());
- }
- }
- /**
- * push(pushAll) array element
- */
- public void pushElementInArray(String _id){
- DB db = getDB();
- db.requestStart();
- coll = getCollection("ChildColl");
- //WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$push",new BasicDBObject("arrays",new BasicDBObject("arr99","99"))));
- List<BasicDBObject> list=new ArrayList<BasicDBObject>();
- list.add(new BasicDBObject("arr99",99));
- list.add(new BasicDBObject("arr100",100));
- WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pushAll",new BasicDBObject("arrays",list)));
- System.out.println("update count:"+result.getN());
- if(result.getLastError().ok()){
- System.out.println("update document success.");
- }else{
- System.out.println(result.getLastError().getErrorMessage());
- }
- db.requestDone();
- }
- /**
- * pull(pullAll) array element
- */
- public void pullElementInArray(String _id){
- DB db = getDB();
- db.requestStart();
- coll = getCollection("ChildColl");
- List<BasicDBObject> list=new ArrayList<BasicDBObject>();
- list.add(new BasicDBObject("arr99",99));
- list.add(new BasicDBObject("arr100",100));
- //WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pull",new BasicDBObject("arrays",new BasicDBObject("arr100",100))));
- WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pullAll",new BasicDBObject("arrays",list)));
- System.out.println("update count:"+result.getN());
- db.requestDone();
- }
- /**
- * pop array element(1,last;-1,first)
- */
- public void popElementInArray(String _id){
- coll = getCollection("ChildColl");
- WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pop",new BasicDBObject("arrays",-1)));//1,last;-1,first
- System.out.println("update count:"+result.getN());
- }
- /**
- * addToSet And Each array element
- */
- public void addToSetAndEachElementInArray(String _id){
- coll = getCollection("ChildColl");
- List list = new ArrayList();
- list.add("str0");
- list.add("str1");
- list.add(new BasicDBObject("arr99",99));
- WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$addToSet",new BasicDBObject("arrays",new BasicDBObject("$each",list))));//1,last;-1,first
- System.out.println("update count:"+result.getN());
- }
- /**
- * 按數組位置更新文檔(查詢條件需要包含更新內容,$爲數組位置佔位符,只更新匹配到的第一個文檔.)
- */
- public void updatePositionInArray(String _id){
- coll = getCollection("ChildColl");
- WriteResult result = coll.update(new BasicDBObject("arrays.arr0", 100),new BasicDBObject("$set",new BasicDBObject("arrays.$.arr0",101)));
- System.out.println("update count:"+result.getN());
- }
以上都是一些基本的查詢、更新操作,當然還有一些如map reduce和關聯查詢等複雜的方法,我將另寫一篇blog總結一下。