mongodb基本操作及存儲圖片顯示方案


先介紹下mongodb的基本操作及使用

第一部:開啟安全性驗證

如果需要給MongoDB數據庫使用安全驗證,則需要用--auth開啟安全性檢查,則只有數據庫認證的用戶才能執行讀寫操作,開戶安全性檢查,有兩種方式:

第一種:重新創建window service服務器,在創建服務時打開安全性驗證。

1. 首先使用管理員身份打開cmd.exe,啟動cmd命令窗口。

2. 在窗口中輸入mongod --auth --logpath "D:\Program Files\mongodb\data\log\MongoDB.log" --logappend --dbpath "D:\Program Files\mongodb\data\db" --directoryperdb --reinstall命令,如下:

上面顯示,首先會移除已創建的window service服務,然后再次創建window service服務並開啟安全性驗證。

 

第二種:直接開啟安全性驗證

1. 首先使用管理員身份打開cmd.exe,啟動cmd命令窗口。

2. 在窗口中輸入mongod --dbpath "D:\Program Files\mongodb\data\db" --logpath "D:\Program Files\mongodb\data\log\MongoDB.log" --auth,如下:

帶有-auth參數時,必須通過認證才可以查詢數據。如果沒有加-auth參數,即使配置了安全認證用戶,也不需要認證誰都可以操作。

 

第二部:創建用戶

定位到D:\Program Files \mongodb\bin,使用mongo.exe進入mongodb的命令行管理。

鍵入命令:

>use admin

>db.addUser(“root”, “root”)

現在我們為mongodb的admin數據庫添加一個用戶root,密碼也是root,mongodb可以為每個數據庫都建立權限認證,也就是你可以指定某個用戶可以登錄到哪個數據庫。上面的代碼,我們為admin數據庫添加了一個root用戶,在mongodb中admin數據庫是一個特別的數據庫,這個數據庫的用戶,可以訪問mongodb中的所有數據庫。

如果你要為test數據庫,設置一個用戶,使用如下命令:

>use test

>db.addUser(“test”, “test”)

好了,現在我們已經為mongodb設置了一個全局用戶root,接下來先重啟mongodb,使創建的用戶生效。d --dbpath "D:\Program Files\mongodb\data\db" --logpath "D:\Program Files\mongodb\data\log\MongoDB.log"  --install

 

MongoDB常見操作

使用操作:

1.常用的命令

  • show dbs    顯示數據庫列表
  • use dbname    進入dbname數據庫,大小寫敏感,沒有這個數據庫也不要緊
  • show collections    顯示數據庫中的集合,相當於表格

2.創建&新增

  • db.users.save({"name":"lecaf"})    創建了名為users的集合,並新增了一條{"name":"lecaf"}的數據
  • db.users.insert({"name":"ghost", "age":10})    在users集合中插入一條新數據,,如果沒有users這個集合,mongodb會自動創建
  • save()和insert()也存在着些許區別:若新增的數據主鍵已經存在,insert()會不做操作並提示錯誤,而save() 則更改原來的內容為新內容。
    • 存在數據:{ _id : 1, " name " : " n1 "} ,_id是主鍵
    • insert({ _id : 1, " name " : " n2 " })    會提示錯誤
    • save({ _id : 1, " name " : " n2 " })     會把 n1 改為  n2 ,有update的作用。

3.刪除

  • db.users.remove()    刪除users集合下所有數據
  • db.users.remove({"name": "lecaf"})    刪除users集合下name=lecaf的數據
  • db.users.drop()或db.runCommand({"drop","users"})    刪除集合users
  • db.runCommand({"dropDatabase": 1})    刪除當前數據庫

4.查找

  • db.users.find()    查找users集合中所有數據
  • db.users.findOne()    查找users集合中的第一條數據

5.修改

  • db.users.update({"name":"lecaf"}, {"age":10})    修改name=lecaf的數據為age=10,第一個參數是查找條件,第二個參數是修改內容,除了主鍵,其他內容會被第二個參數的內容替換,主鍵不能修改

高級使用

1.條件查找

  • db.collection.find({ "key" : value })    查找key=value的數據
  • db.collection.find({ "key" : { $gt: value } })    key > value
  • db.collection.find({ "key" : { $lt: value } })    key < value
  • db.collection.find({ "key" : { $gte: value } })    key >= value
  • db.collection.find({ "key" : { $lte: value } })    key <= value
  • db.collection.find({ "key" : { $gt: value1 , $lt: value2 } })    value1 < key <value2
  • db.collection.find({ "key" : { $ne: value } })    key <> value
  • db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })    取模運算,條件相當於key % 10 == 1 即key除以10余數為1的
  • db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } })    不屬於,條件相當於key的值不屬於[ 1, 2, 3 ]中任何一個
  • db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } })    屬於,條件相當於key等於[ 1, 2, 3 ]中任何一個
  • db.collection.find({ "key" : { $size: 1 } })    $size 數量、尺寸,條件相當於key的值的數量是1(key必須是數組,一個值的情況不能算是數量為1的數組)
  • db.collection.find({ "key" : { $exists : true|false } })    $exists 字段存在,true返回存在字段key的數據,false返回不存在字度key的數據
  • db.collection.find({ "key": /^val.*val$/i })    正則,類似like;“i”忽略大小寫,“m”支持多行
  • db.collection.find({ $or : [{a : 1}, {b : 2} ] })    $or或 (注意:MongoDB 1.5.3后版本可用),符合條件a=1的或者符合條件b=2的數據都會查詢出來
  • db.collection.find({ "key": value , $or : [{ a : 1 } , { b : 2 }] })    符合條件key=value ,同時符合其他兩個條件中任意一個的數據
  • db.collection.find({ "key.subkey" :value })    內嵌對象中的值匹配,注意:"key.subkey"必須加引號
  • db.collection.find({ "key": { $not : /^val.*val$/i } })    這是一個與其他查詢條件組合使用的操作符,不會單獨使用。上述查詢條件得到的結果集加上$not之后就能獲得相反的集合。

2.排序

  • db.collection.find().sort({ "key1" : -1 ,"key2" : 1 })    這里的1代表升序,-1代表降序

3.其他

  • db.collection.find().limit(5)    控制返回結果數量,如果參數是0,則當作沒有約束,limit()將不起作用
  • db.collection.find().skip(5)    控制返回結果跳過多少數量,如果參數是0,則當作沒有約束,skip()將不起作用,或者說跳過了0條
  • db.collection.find().skip(5).limit(5)    可用來做分頁,跳過5條數據再取5條數據
  • db.collection.find().count(true)    count()返回結果集的條數
  • db.collection.find().skip(5).limit(5).count(true)    在加入skip()和limit()這兩個操作時,要獲得實際返回的結果數,需要一個參數true,否則返回的是符合查詢條件的結果總數

 

圖片存儲方案

maven中引入mongodb jar包

public class MongoImgStore {

    public static void main(String[] args) throws Exception {
        //saveImgFile();
        readImgFile();
    }

    public static void saveImgFile() throws Exception {

        //連接服務器 ,線上肯定是帶單獨的ip 應該這樣使用 Mongo("ip")
        Mongo mongo = new Mongo();
        //連接數據庫
        DB db = mongo.getDB("ImgGridFS");
        //文件操作是在DB的基礎上實現的,與表和文檔沒有關系
        GridFS gridFS = null;
        gridFS = new GridFS(db);

        String fileName = "79831-uwceV8R.jpg";
        File readFile = new File("F:\\360data\\重要數據\\桌面\\page\\" + fileName);

        GridFSInputFile mongofile = gridFS.createFile(readFile);
        //可以再添加屬性
        mongofile.put("path", "F:\\360data\\重要數據\\桌面\\" + fileName);
        //保存
        mongofile.save();
    }

    public static void readImgFile() throws Exception {
        //鏈接服務器
        Mongo mongo = new Mongo();
        //連接數據庫
        DB db = mongo.getDB("ImgGridFS");
        GridFS gridFs = null;
        gridFs = new GridFS(db);

        //查找條件
        DBObject query = new BasicDBObject();
        //查詢的結果:
        List<GridFSDBFile> listfiles = gridFs.find(query);
        GridFSDBFile gridDBFile = listfiles.get(0);

        //獲得其中的文件名
        //注意 : 不是fs中的表的列名,而是根據調試gridDBFile中的屬性而來
        String fileName = (String) gridDBFile.get("filename");

        System.out.println("從Mongodb獲得文件名為:" + fileName);

        File writeFile = new File("F:\\360data\\重要數據\\桌面\\page\\" + fileName);
        if (!writeFile.exists()) {
            writeFile.createNewFile();
        }

        System.out.println("可以訪問的地址:"+writeFile.getAbsoluteFile());
        System.out.println("總占用空間:"+writeFile.getTotalSpace());
        System.out.println("總占用空間:"+gridDBFile.getInputStream());


        //把數據寫入磁盤中
        //查看相應的提示
        gridDBFile.writeTo("F:\\360data\\重要數據\\桌面\\page\\lovemm.jpg");
        //寫入文件中
        gridDBFile.writeTo(writeFile);

    }

以上先保存圖片到mongodb中,在MongoVUE中查看,我們保存了兩次,直接雙擊圖片也是能顯示的

那么如果是在jsp中要怎么顯示呢

這里就可以采用流讀取到image緩沖中來呈現

在stucts中可以這樣設置

 寫一個getImg action方法然后把剛剛的讀取代碼搬過來   

public String getImg() throws Exception {
        try {
            //鏈接服務器
            Mongo mongo = new Mongo();
            //連接數據庫
            DB db = mongo.getDB("testGridFS");
            GridFS gridFs = null;
            gridFs = new GridFS(db);

            //查找條件
            DBObject query = new BasicDBObject();
            //查詢的結果:
            List<GridFSDBFile> listfiles = gridFs.find(query);
            GridFSDBFile gridDBFile = listfiles.get(0);

            //獲得其中的文件名
            //注意 : 不是fs中的表的列名,而是根據調試gridDBFile中的屬性而來
            String fileName = (String) gridDBFile.get("filename");

            System.out.println("從Mongodb獲得文件名為:" + fileName);

            File writeFile = new File("F:\\360data\\重要數據\\桌面\\page\\" + fileName);
            if (!writeFile.exists()) {
                writeFile.createNewFile();
            }

            System.out.println("可以訪問的地址:" + writeFile.getAbsoluteFile());
            System.out.println("總占用空間:" + writeFile.getTotalSpace());
            //System.out.println("總占用空間:" + gridDBFile.getInputStream());

            //todo:jsp直接返回圖片處理  @Royal   @Date 2016-06-22
            HttpServletResponse resp=getResponse();
            HttpServletRequest req=getRequest();

            resp.setHeader("Cache-Control", "no-store, no-cache");
            resp.setContentType("image/jpeg");

            BufferedImage bi = ImageIO.read(gridDBFile.getInputStream());
            ServletOutputStream out = resp.getOutputStream();
            ImageIO.write(bi, "jpg", out);
            //把數據寫入磁盤中
            //查看相應的提示
            //gridDBFile.writeTo("F:\\360data\\重要數據\\桌面\\page\\lovemm.jpg");
            //寫入文件中
            //gridDBFile.writeTo(writeFile);

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

        return null;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM