mongo 高級操作

http://www.cnblogs.com/dennisit/archive/2013/01/29/2881006.html

mongodb高級操作及在Java企業級開發中的應用.

 

Java連接mongoDB

Java連接MongoDB需要驅動包,個人所用包爲mongo-2.10.0.jar.可以在網上下載最新版本.

複製代碼
package org.dennisit.mongodb.study;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;

/**
 * 
 *    MongoDBUtil.java
 *
 *     功   能: Java連接MongoDB小Demo(連接並插入一條數據)
 *     類   名: MongoDBUtil
 *
 *  ver      変更日        角色           擔當者     変更內容
 *     ──────────────────────────────────────────────
 *  V1.00   2013-1-16   Demo模塊    蘇若年     初版
 *
 *     Copyright (c) 2013 dennisit corporation All Rights Reserved.
 *   
 *  Email:<a href="mailto:[email protected]">發送郵件</a>
 *
 */
public class MongoDBUtil {

    public static void main(String[] args) {
        Mongo mongo = null;
        try {
            //通過連接字符串得到一個數據庫實例的連接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //獲得一個數據庫對象,mydb爲數據庫民稱
        DB db = mongo.getDB("mydb");
        //指定安全授權信息[mydb數據庫的用戶名爲mydbusr,密碼爲123]
        db.authenticate("mydbusr", "123".toCharArray());
        
        //聲明一個collection對象
        DBCollection collection = db.getCollection("user");
        //聲明一個document文檔對象,用戶存儲數據
        BasicDBObject doc = new BasicDBObject();
        doc.put("name", "suruonian");
        doc.put("email", "[email protected]");
        BasicDBObject experience = new BasicDBObject();
        experience.put("year of 2012", "i work in hangzhou");
        experience.put("year of 2013", "i work in shenzhen");
        doc.put("work experience", experience);
        //調用collection的insert方法,將數據持久化到磁盤上.
        collection.insert(doc);
        System.out.println("test data insert finish ");
    }
}

這時登錄到mydb.查看
> db.user.find({},{_id:0});
{ "name" : "suruonian", "email" : "[email protected]", "work experience" : { "year of 2012" : "i work in hangzhou", "year of 2013" : "i work in shenzhen" } }
>
複製代碼

 

mongoDB查詢數據

通過findOne()查詢一條數據

複製代碼
         //連接到mongodb
        
        //獲得一個數據庫對象,mydb爲數據庫民稱
        DB db = mongo.getDB("mydb");
        //指定安全授權信息[mydb數據庫的用戶名爲mydbusr,密碼爲123]
        db.authenticate("mydbusr", "123".toCharArray());
        
        //聲明一個collection對象
        DBCollection collection = db.getCollection("user");
        DBObject userdoc= collection.findOne();
        System.out.println("查詢到的一條記錄爲:" + userdoc);
    
複製代碼

mongoDB更新數據

將user集合中name爲suruonian的name值改成dennisit.

複製代碼
         
         //連接到mongodb

        //聲明collection對象
        DBCollection collection = db.getCollection("user");
        
        //定義一個查詢對象,
        DBObject updateAim = new BasicDBObject();
        updateAim.put("name", "suruonian");
        
        System.out.println("通過用戶名查找到的對象爲:" + collection.findOne(updateAim));
        
        //定義一個更新對象,類似於set語句
        DBObject updatedValue = new BasicDBObject();
        updatedValue.put("name", "dennisit");
        
        //db.user.update({name:"suruonian"},{$set:{name:dennisit}});
        DBObject updateSetValue = new BasicDBObject("$set",updatedValue);
        
        //將查詢對象和更新對象作爲參數傳給update來完成更新.
        collection.update(updateAim, updateSetValue);
        
        System.out.println("更新後查詢到的一條記錄爲:" + collection.findOne());
    
複製代碼

mongoDB刪除數據

刪除操作user集合中name爲dennisit的用戶

複製代碼
        
         //連接到mongodb

         //聲明collection對象
        DBCollection collection = db.getCollection("user");
        
        //定義一個查詢對象,
        DBObject aimObj = new BasicDBObject();
        aimObj.put("name", "dennisit");
        
        System.out.println("通過用戶名查找到的對象爲:" + collection.findOne(aimObj));
        
        collection.remove(aimObj);
        System.out.println("刪除後查詢到的一條記錄爲:" + collection.findOne());
複製代碼

MonggoDB保證事物的一致性

MongoDB的Java驅動是線程安全的,對於一般的應用,只要一個mongo實例即可.mongo有個內置的連接池(連接池默認可容納10個數據庫連接),在有大量寫和讀的環境中,爲了確保在一個session中使用同一個DB時,可以通過DB類的requestStart()方法打開失去控制,待所有業務代碼編寫完畢後,再通過DB類的requestDone()方法結束事物控制.這樣就保證了事物的原子性.

複製代碼
       
        //聲明collection對象
        DBCollection collection = db.getCollection("user");
        
        //開始事務控制
        db.requestStart();
        
        //事務相關操作
        
        //結束事物控制
        db.requestDone();
        
複製代碼

MongoDB庫級別操作

獲取連接的IP地址

mongo.getAddress();

 

列出所有數據庫[此操作只針對超級用戶]

mongo.getDatabaseNames();

 

刪除指定數據庫[此操作只針對超級用戶]

mongo.dropDatabase("testdb");

 

代碼演示

複製代碼
    public static void main(String[] args) {
        
        Mongo mongo = null;
        try {
            //通過連接字符串得到一個數據庫實例的連接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //連接超級用戶
        DB db = mongo.getDB("admin");
        //指定安全授權信息[超級用戶的用戶名爲root,密碼爲root123]
        db.authenticate("root", "root123".toCharArray());
        
        //getAddress方法獲取IP和端口
        System.out.println("當前連接的IP和端口爲:" + mongo.getAddress());
        
        //列出所有數據庫,此操作只針對超級用戶
        System.out.println("系統中的所有數據庫爲:" + mongo.getDatabaseNames());
        
        //刪除數據庫,此操作只針對超級用戶
        mongo.dropDatabase("testdb");
        System.out.println("系統中的所有數據庫爲:" + mongo.getDatabaseNames());

    }
控制檯輸出信息
當前連接的IP和端口爲:127.0.0.1:27017
系統中的所有數據庫爲:[admin, mydb, testdb, local, test]
系統中的所有數據庫爲:[admin, mydb, local, test]
複製代碼

MongoDB對用戶的操作

爲連接的數據庫添加用戶

        DB db = mongo.getDB("mydb");
        db.addUser("username", "password".toCharArray(),true);

 

參數說明

第一個參數爲要條件的用戶名

第二個參數爲要添加的用戶對應的訪問口令

第三個參數爲readOnly,代表用戶的權限,爲true表示值讀權限,爲false表示爲讀/寫權限.默認爲false.不傳參代表默認.

 

刪除某個用戶

        DB db = mongo.getDB("mydb");
        db.removeUser("username");

參數說明

傳入的參數爲要刪除的用戶名.要刪除的用戶必須應是已存在的.

 

MongoDB對集合collection的操作

Collection是MongoDB中存儲數據的最小單元.

列出連接數據庫下的所有集合

複製代碼
         DB db = mongo.getDB("mydb");
        //指定安全授權信息[超級用戶的用戶名爲root,密碼爲root123]
        db.authenticate("mydbusr", "123".toCharArray());
        
        //列出mydb數據庫中的所有collection
        Set<String> collets = db.getCollectionNames();
        for(String str : collets){
            System.out.println(str);
        }
複製代碼

 

判斷某個collection是否存在

        //判斷user集合是否存在,返回值爲boolean類型
        System.out.println(db.collectionExists("user"));

 

新建collection

Java可以通過DB類的createCollection(String name, DBObject option)方法新建集合

參數說明

第一個參數表示創建的collection的名字

第二個參數決定了是否創建的是Capped Collection.

複製代碼
        //創建非CappedCollection對象,false表示不是一個CappedCollection
        DBObject optial = new BasicDBObject().append("capped", false);
        //顯示創建非CappedCollection
        db.createCollection("nocapped", optial);
        System.out.println(db.getCollection("nocapped").getStats().toString());
        
        //創建CappedCollection對象,true表示是一個CappedCollection
        DBObject opt = new BasicDBObject().append("capped", true).append("max", 5);
        db.createCollection("iscapped", opt);
        
        System.out.println(db.getCollection("iscapped").getStats().toString());
        
        //使用isCapped()判斷是否爲CappedCollection
        System.out.println(db.getCollection("nocapped").isCapped()); //false
        System.out.println(db.getCollection("iscapped").isCapped()); //true
複製代碼

 

刪除collection

通過DBCollection的drop()方法刪除集合.

         DBCollection collect = db.getCollection("iscapped");
        collect.drop();    //刪除iscapped集合

 

計算document數量

複製代碼
        //控制檯插入測試數據for (i=1; i<=5;i++){ db.user.insert( {name:"user"+i , age: i+4*5 } ); }
        DBCollection collectuser = db.getCollection("user");
        System.out.println("集合" + collectuser + "下共有" + collectuser.getCount() + "條記錄");
        
        BasicDBObject  obj = new BasicDBObject();
        BasicDBObject gtTag = new BasicDBObject();
        gtTag.put("$gt", 23);
        //db.user.find({age:{$gt:23}});
        obj.put("age", gtTag);
        System.out.println("集合" + collectuser + "下年齡大於25的共有" + collectuser.getCount(obj) + "條記錄");

控制檯輸出
集合user下共有5條記錄
集合user下年齡大於25的共有2條記錄
複製代碼

 

通過遊標獲取所有document

Java可以通過遊標DBCursor的方式來獲取每一條document.

複製代碼
        DBCollection collection = db.getCollection("user");
        //用遊標獲取所有數據
        DBCursor cur = collection.find();    
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
也可以查詢部分,如部分顯示:DBCursor cur = collection.find().limit(3);    
複製代碼

 

對索引的操做

 

創建索引

Java可以通過DBCollection類的createIndex(DBObject keys)方法創建索引,它接收一個DBObject類型的參數“keys”用於表明在哪些列上創建索引.

        DBCollection collection = db.getCollection("user");
        //在user集合的name列上創建索引
        collection.createIndex(new BasicDBObject("name",1));
可以通過db.user.getIndexes();查看索引信息

 

獲取索引

DBCollection類的getIndexInfo();

複製代碼
        DBCollection collection = db.getCollection("user");
        //獲取集合中的所有索引信息
        List<DBObject> list = collection.getIndexInfo();
        for(DBObject var : list){
            System.out.println(var);
        }
類似於 db.user.getIndexes();
複製代碼

 

刪除索引

DBCollection的dropIndexes()刪除當前集合中的所有索引.

複製代碼
        DBCollection collection = db.getCollection("user");
        
        //刪除集合中的指定索引信息,刪除name索引,1表示刪除爲真
        collection.dropIndex(new BasicDBObject("name",1));
        
        //刪除該集合中所有索引[_id索引不支持刪除]
        collection.dropIndexes();
可以通過db.user.getIndexKeys();查看user集合中的索引
複製代碼

 

Java對MongoDB的高級查詢

 

使用QueryBuilder查詢構造器對MongoDB進行高級查詢

複製代碼
SQL語句:
         select * from user where username = ‘user3’;
MongoDB:
         db.user.find( { name:"user3"} );
Java代碼:
        DBCollection collection = db.getCollection("user");
        //查詢用戶名爲user3的用戶
        DBObject query = new QueryBuilder().put("name").is("user3").get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
輸出結果:
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee7"} , "name" : "user3" , "age" : 23.0}
複製代碼

 

notEquals不等於

查詢user集合中用戶名name值不等於user3的用戶

複製代碼
SQL語句:
         select * from user where username != ‘user3’;
MongoDB:
         db.user.find( { name:{$ne:"user3"} } );
Java代碼:
        DBCollection collection = db.getCollection("user");
        //查詢用戶名不爲user3的用戶
        DBObject query = new QueryBuilder().put("name").notEquals("user3").get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
輸出結果:
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee5"} , "name" : "user1" , "age" : 21.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee6"} , "name" : "user2" , "age" : 22.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee8"} , "name" : "user4" , "age" : 24.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee9"} , "name" : "user5" , "age" : 25.0}
複製代碼

 

greaterThan大於

查詢user集合中age大於22的用戶

SQL語句:
         select * from user where age > 22;
MongoDB:
         db.user.find( { age:{$gt:22} } );
QueryBuilder構造:
        DBObject query = new QueryBuilder().put("age").greaterThan(22).get();

 

 

greaterThanEquals大於等於

查詢user集合中age大於等於22的用戶

SQL語句:
         select * from user where age >= 22;
MongoDB:
         db.user.find( { age:{$gte:22} } );
QueryBuilder構造:
        DBObject query = new QueryBuilder().put("age").greaterThanEquals(22).get();

 

lessThan小於

查詢user集合中age小於22的用戶

SQL語句:
         select * from user where age < 22;
MongoDB:
         db.user.find( { age:{$lt:22} } );
QueryBuilder構造:
        DBObject query = new QueryBuilder().put("age").lessThan(22).get();

 

lessThanEquals小於等於

查詢user集合中age小於等於22的用戶

SQL語句:
         select * from user where age <= 22;
MongoDB:
         db.user.find( { age:{$lte:22} } );
QueryBuilder構造:
        DBObject query = new QueryBuilder().put("age").lessThanEquals(22).get();

 

 

In範圍內

查詢user集合中age在23或24的記錄

複製代碼
SQL語句:
         select * from user where age in (23,24);
MongoDB:
         db.user.find( { age:{$in:[23,24]} } );
Java代碼:
        DBCollection collection = db.getCollection("user");
        //查詢user集合中age爲23或者24的用戶
        int[] inList = {23,24};
        DBObject query = new QueryBuilder().put("age").in(inList).get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
複製代碼

 

 

notIn範圍外

查詢user集合中age不是23或24的記錄

複製代碼
SQL語句:
         select * from user where age not in (23,24);
MongoDB:
         db.user.find( { age:{$nin:[23,24]} } );
Java代碼:
        DBCollection collection = db.getCollection("user");
        //查詢user集合中age爲23或者24的用戶
        int[] inList = {23,24};
        DBObject query = new QueryBuilder().put("age").notIn(inList).get();
        DBCursor cur = collection.find(query);
        
複製代碼

 

and邏輯與

查詢user集合中age大於22並且性別爲”man“的用戶

複製代碼
SQL語句:
         select * from user where sex = ‘man’ and age > 20;
MongoDB:
         db.user.find({sex:"man",age:{$gt:20}});
Java代碼:
        //查詢user集合中age大於22並且性別爲”man“的用戶
        DBObject query = new QueryBuilder().put("sex").is("man").and("age").greaterThan(20).get();
複製代碼

 

正則表達式

查詢name以user開頭的記錄

複製代碼
SQL語句:
         select * from user where name like ‘user%’;
MongoDB:
         db.user.find({name:/^user.*/});
Java代碼:
        DBCollection collection = db.getCollection("user");
        Pattern pattern = Pattern.compile("^user");
        BasicDBObject query = new BasicDBObject("name",pattern);
複製代碼

 

分頁查詢

mongoDB中通過skip()和limit()結合實現分頁

複製代碼
    public static void main(String[] args) {
        
        Mongo mongo = null;
        try {
            //通過連接字符串得到一個數據庫實例的連接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //連接超級用戶
        DB db = mongo.getDB("mydb");
        //指定安全授權信息[超級用戶的用戶名爲root,密碼爲root123]
        db.authenticate("mydbusr", "123".toCharArray());
        
        int  perNum = 10;        //每頁顯示的數目
        int  count = 0;            //數據庫中總共記錄數目
        int  pageNum = 0;        //分頁後的頁數
        
        DBCollection collection = db.getCollection("user");
        
        count = (int)collection.getCount();        //總共記錄數
        pageNum = (count-1)/perNum + 1;            //計算總共頁數
        
        System.out.println("數據庫"+collection+"中共有"+count+"條記錄,每頁顯示"+perNum+"條記錄,可顯示"+pageNum+"頁");
        
        //循環分頁打印
        for(int i=0; i<pageNum; i++){
            System.out.println("------------第" + (i+1) + "頁數據------------");
            DBCursor cur = collection.find().skip(i*perNum).limit(perNum);
            while(cur.hasNext()){
                System.out.println(cur.next());
            }
        }
    }
複製代碼

 

 

Java操作GridFS

 

插入數據

使用GridFS類的createFile(File file)方法可以將大文件保存到MongoDB中,該方法接收一個參數,表示本地文件路徑

複製代碼
public static void main(String[] args) {
        Mongo mongo = null;
        try {
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            // TODO: handle exception
        }
        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());
        

        File zipFile = new File("D:/freemarker源碼.rar");    //創建文件對象
        //將文件存放到file數據庫中
        GridFS gfs = new GridFS(db,"file");    
        
        //創建大文件對象輸入流
        GridFSInputFile gfsFile = null;    
        try {
            //將本地文件存儲到mongo中
            gfsFile = gfs.createFile(zipFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //設置存儲的文件名
        gfsFile.setFilename("demozip");
        gfsFile.save();
    }
在mydb數據庫下查看存儲的文件信息
> db
mydb
> show collections;
file.chunks
file.files
system.indexes
system.users
user
> db.file.files.findOne();
{
        "_id" : ObjectId("50f780a7de886482c92a56c9"),
        "chunkSize" : NumberLong(262144),
        "length" : NumberLong(83711),
        "md5" : "51f235ccf838511eb0f53633dbca22b3",
        "filename" : "demozip",
        "contentType" : null,
        "uploadDate" : ISODate("2013-01-17T04:40:07.240Z"),
        "aliases" : null
}
複製代碼

 

查詢數據

因爲上傳了一個zip文檔,爲了方便觀察,使用GridFS類的findOne(DBObject query)方法,按文件名查找數據庫中的GridFS對象信息,該方法結束1個參數,代表查詢條件.

複製代碼
        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());
        
        //將文件存放到file數據庫中
        GridFS gfs = new GridFS(db,"file");    
        
        //查詢GridFS數據,按照文件名查詢 db.file.files.findOne({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        System.out.println(zipfile);
複製代碼

 

讀取並保存數據

首先用find或者findOne方法找到GridFS對象,再用writeTo方法將數據寫到本地.

複製代碼
        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());
        
        GridFS gfs = new GridFS(db,"file");    
        
        //查詢GridFS數據,按照文件名查詢 db.file.files.find({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        System.out.println("服務器端文件MD5值爲:" + zipfile.getMD5());
        try {
            //將讀取到的文件寫到本地
            zipfile.writeTo("E:/downgidfs.zip");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
控制檯輸出:服務器端文件MD5值爲:51f235ccf838511eb0f53633dbca22b3
驗證下載到的文件的MD5
E:\>md5sum downgidfs.zip
51f235ccf838511eb0f53633dbca22b3 *downgidfs.zip
複製代碼

 

刪除數據

Java中使用remove(DBObject query)來實現移除數據

        GridFS gfs = new GridFS(db,"file");        
        //查詢GridFS數據,按照文件名查詢 db.file.files.find({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        //刪除查詢到的GridFS數據
        gfs.remove(zipfile);

發佈了7 篇原創文章 · 獲贊 41 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章