上幾篇博客簡單對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的學習做一個小小的準備。