RedHat6 使用CentOS yum源
615
2025-04-02
1、簡介
GridFS是一種將大型文件存儲在MongoDB數據庫中的文件規范,所有官方支持的驅動均實現了GridFS規范。
1.1、為什么要用GirdFS
由于MongoDB中BSON對象大小是有限制的,所有GridFS規范提供了一種透明的機制,可以將一個大文件分割成為多個較小的文檔,這樣的機制允許我們有效的保存大文件對象,特別是對于那些巨大的文件,比如視頻、高清圖片等。
1.2、如何實現海量存儲
為實現這點,該規范制定了一個將文件分塊的標準,每個文件都將在文件集合對象中保存一個元數據對象,一個或者多個chunk塊對象可以被組合保存在一個chunk塊集合中,大多數情況下,你無需了解此規范中細節。而可將注意力放在各個語言版本的驅動中有關GridFS API的部分或是如何使用mongofiles工具上。
1.3、語言支持
GridFS對Java、Perl、PHP、Python、Ruby等程序語言均支持,且提供了良好的API接口。
1.4、簡單介紹
GridFS使用兩個表來存儲數據:
files包含元數據對象
chunks包含其他一些相關信息的二進制塊。
為了使多個GridFS命名為一個單一的數據庫,文件和塊都有一個前綴,默認情況下,前綴是fs,所以任何默認的GridFS存儲將包括命名空間fs.files和fs.chunks。各種第三方語言的驅動有權限改變這個前綴,所以你可以嘗試設置另一個GridFS命名空間用于存儲照片,它的具體位置為:photos.files和photos.chunks,下面我們看一下實際例子。
1.5、命令行工具
mongofiles是從命令行操作GridFS的一種工具,比如我們/usr/local/xuz/test.html文件存到庫里面,具體用法如下:
[root@localhost bin]# ./mongofiles put /usr/local/xuz/test.html
connected to: 127.0.0.1
added file: { _id: ObjectId('54a8d33846d47e7bbe9a847a'), filename: "/usr/local/xuz/test.html", chunkSize: 261120, uploadDate: new Date(1420350265089), md5: "aead353cb437d4d29d61f05bb548b191", length: 31 }
done!
下面我們查看一下庫里有哪些GridFS文件,在mongofiles后加一個參數list即可。
[root@localhost bin]# ./mongofiles list
connected to: 127.0.0.1
/usr/local/xuz/test.html ? ? ? ?31
接下來我們進庫里看一下是否有新的東西
[root@localhost bin]# ./mongo
MongoDB shell version: 2.6.6
connecting to: test
> show collections
c1
c2
c3
c4
fs.chunks ? ----上文提到的fs.chunks
fs.files ? ?----上文提到的fs.files
system.indexes
system.js
xuz
我們繼續查看fs.files中的內容
> db.fs.files.find();
{ "_id" : ObjectId("54a8d33846d47e7bbe9a847a"), "filename" : "/usr/local/xuz/test.html", "chunkSize" : 261120, "uploadDate" : ISODate("2015-01-04T05:44:25.089Z"), "md5" : "aead353cb437d4d29d61f05bb548b191", "length" : 31 }
字段說明:
Filename:存儲的文件名
chunkSize:chunks分塊的大小
uploadDate:入庫的時間
md5:此文件的md5碼
length:文件大小,單位字節
看來fs.files中存儲的是一些基礎的元數據信息。
我們繼續查看fs.chunks中的內容
> db.fs.chunks.find();
{ "_id" : ObjectId("54a8d339deaed25af579df57"), "files_id" : ObjectId("54a8d33846d47e7bbe9a847a"), "n" : 0, "data" : BinData(0,"c2RzZHNkCnNkc2RzZApzZHNkcwpzZHNkcwpzZHNkCg==") }
其中比較重要的字段是n,它代表的是chunks的序號,此序號從0開始,看來fs.chunks中存儲的是一些實際的內容數據信息。
我們既然能將此文件存進去,我們就應該有辦法將其取出來,下面我們將該文件取出來。
[root@localhost bin]# cd /usr/local/xuz
[root@localhost xuz]# ls -l
total 4
-rw-r--r--. 1 root root 31 Jan ?4 13:43 test.html
[root@localhost xuz]# rm -rf test.html --刪除文件
[root@localhost xuz]# ll
total 0
[root@localhost bin]# ./mongofiles get /usr/local/xuz/test.html
connected to: 127.0.0.1
done write to: /usr/local/xuz/test.html
[root@localhost bin]# md5sum /usr/local/xuz/test.html ? ?--檢驗md5,結果跟存進庫里的相同
aead353cb437d4d29d61f05bb548b191 ?/usr/local/xuz/test.html
最后查看是否取出該文件。
[root@localhost bin]# cd /usr/local/xuz
[root@localhost xuz]# ll
total 4
-rw-r--r--. 1 root root 31 Jan ?4 13:57 test.html ? ? --成功取出文件
1.6、索引
db.fs.chunks.ensureIndex({files_id:1,n:1}),{unique:true}
這樣,一個塊就可以利用它的files_id和n的值進行檢索,注意,GridFS仍然可以用findOne得到第一個塊,如下:
db.fs.chunks.findOne({files_id:myFileID,n:0});
MongoDB
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。