MongoDB對圖片進行CRUD操作——與JAVA結合,mongodbcrud

來源:互聯網
上載者:User

MongoDB對圖片進行CRUD操作——與JAVA結合,mongodbcrud

        上幾篇部落格簡單對MongoDB進行了簡單介紹和如何安裝,以及在dos下是如何操作MongoDB和在安裝MongoDB中,出現了什麼錯誤,是如何解決的。當然這些都還不夠,我們還要用到實際當中去。我用MyEclipse+JDK1.7做了一個簡單的demo,來展示下MongoDB怎麼運用到實際中去。

       MongoDB作為一個NoSql資料庫的代表,存取多媒體資料,應該是強項吧?那麼,在MongoDB中是如何對圖片進行CRUD操作的。

       上幾篇部落格中已經提到,MongoDB的文檔結構是BSON格式,BSON格式本身支援儲存二進位格式的資料,所以可以把檔案的二進位格式的資料直接儲存到MongoDB的文檔結構中。但是一個BSON的最大長度不能超過4M,所以限制了單個文檔中能存入的最大檔案不能超過4M。為瞭解決這個問題,MongoDB提供了“GridFS”方式,“GridFS”方式對檔案操作需要引入相關jar包——mongo-java-driver-2.9.3.jar。

      不多說,看執行個體:

package com.zd.mongodb.common;import java.io.File;import java.io.IOException;import java.net.UnknownHostException;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBObject;import com.mongodb.Mongo;import com.mongodb.gridfs.GridFS;import com.mongodb.gridfs.GridFSDBFile;import com.mongodb.gridfs.GridFSInputFile;public class MongoDBCommon {// 串連mongodbpublic DB MongoDbConnection() {Mongo m = null;try {m = new Mongo("localhost", 27017);} catch (UnknownHostException e) {e.printStackTrace();}DB db = m.getDB("test");return db;}// 儲存圖片資訊public void saveFile(String connection, String id, String file) {DB db = MongoDbConnection();  //擷取MongoDB的資料庫File imageFile = new File(file);GridFS gfsPhoto = new GridFS(db, connection); //connection為集合名詞GridFSInputFile gfsFile = null;try {gfsFile = gfsPhoto.createFile(imageFile);} catch (IOException e) {e.printStackTrace();}gfsFile.setId(id);gfsFile.setContentType("image/jpeg");gfsFile.save();}// 讀取檔案public void readFile(String connection, String fileName) {DB db = MongoDbConnection();  //擷取串連DBCollection collection = db.getCollection(connection);  //connection為集合名稱String newFileName = fileName;GridFS gfsPhoto = new GridFS(db, connection);GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);System.out.println(imageForOutput);  //返回資料以BSON格式體現}//根據id查詢相應檔案public void findByObjectId(String connection, String id) {DB db = MongoDbConnection();DBCollection collection = db.getCollection(connection);DBObject dbObj = collection.findOne(id);System.out.println(dbObj);  //返回資料以BSON格式體現}// 刪除檔案public void deleteFile(String connection,String id) {DB db = MongoDbConnection();DBCollection collection = db.getCollection(connection);DBObject o=collection.findOne(id);collection.remove(o);}}


用戶端:

package com.zd.mongodb.common;public class ZhudanTest { public static void main(String[] args) throws Exception { MongoDBCommon dbCommon=new MongoDBCommon(); String newFileName="zhudan.jpg";     String imageFile="D:/生活/照片/me/zhudan.jpg";//     String connection="photo.files";     String connection="photo";          //根據id儲存資料     String id="1111";     dbCommon.saveFile( connection, id, imageFile);          //根據名稱擷取資料// dbCommon.readFile(connection, newFileName);          //根據id刪除資料//     String id="1111";//     dbCommon.deleteFile(connection,id);      //根據id查詢資料// String id="1111";// dbCommon.findByObjectId(connection, id);  }}



再分析下原理:

       建立photo時,驅動首先會在當前資料庫建立兩個集合:一個是"photo.files"集合,另一個是"photo.chunks"集合,前者記錄了檔案名稱,檔案建立時間,檔案類型等基本資料;後者分Block Storage了檔案的位元據(並支援加密這些位元據)。

       一個trunk有一個預設的大小,當檔案超過這個預設大小後,會把檔案分割成多個chunk,再把這些chunk儲存到photo.chunks中,最後再把檔案資訊存入到photo.files中。

        在讀取檔案的時候,先根據查詢條件,在photo.files中找到一個合適的記錄,得到“_id”的值,再據這個值到photo.chunks中尋找所有“files_id”為“_id”的chunk,並按“n”排序,最後依次讀取chunk中“data”對象的內容,還原成原來的檔案。

       說到原理,我在測試的過程中,在儲存圖片的時候,我需要用的集合名稱是photo,在讀取和刪除圖片的時候,我需要用的完整集合名稱是photo.files。如果此時我用集合名未photo時,尋找不到相關資料。

總結:

       MongoDB作為一個NoSql資料庫的代表,其實它裡麵包含的東西還有很多,我所接觸到的也只是冰山一角,為以後的MongoDB的學習做一個小小的準備。

        



      


       

        

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.