上幾篇博客簡單對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 { // 連接mongodb public 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"集合,前者記錄了文件名,文件創建時間,文件類型等基本信息;後者分塊存儲了文件的二進制數據(並支持加密這些二進制數據)。
一個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的學習做一個小小的准備。