GridFS 是 MongoDB 的一個(gè)用來(lái)存儲(chǔ)/獲取大型數(shù)據(jù)(圖像、音頻、視頻等類型的文件)的規(guī)范。它相當(dāng)于一個(gè)存儲(chǔ)文件的文件系統(tǒng),但它的數(shù)據(jù)存儲(chǔ)在 MongoDB 的集合中。GridFS 能存儲(chǔ)超過(guò)文檔尺寸限制(16 MB)的文件。
GridFS 將文件分解成塊,將每塊數(shù)據(jù)保存在不同的文檔中,每塊大小最高為 255 KB。
GridFS 默認(rèn)使用 fs.files 和 fs.chunks 集合來(lái)存儲(chǔ)文件的元數(shù)據(jù)和塊。每個(gè)塊都由唯一的 _id
ObjectId 字段來(lái)標(biāo)識(shí)。fs.files 用作父級(jí)文檔。fs.chunks 文檔中的 files_id 字段將塊連接到父級(jí)文檔上。
fs.files 集合的一個(gè)范例文檔如下所示:
{
"filename": "test.txt",
"chunkSize": NumberInt(261120),
"uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
"md5": "7b762939321e146569b07f72c62cca4f",
"length": NumberInt(646)
}
該文檔指定了文件名、塊大小、上傳日期以及長(zhǎng)度。
下面是 fs.chunks 文檔的一個(gè)范例文檔:
{
"files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
"n": NumberInt(0),
"data": "Mongo Binary Data"
}
下面我們將使用 put 命令,利用 GridFS 存儲(chǔ)一個(gè) mp3 文件。該例中,我們將使用 MongoDB 的 bin 文件夾下的 mongofiles.exe 工具。
打開(kāi)命令行提示符,瀏覽至 mongofiles.exe,輸入下列代碼:
>mongofiles.exe -d gridfs put song.mp3
上述代碼中,gridfs 是保存文件所在的數(shù)據(jù)庫(kù)名稱。如果數(shù)據(jù)庫(kù)不存在,MongoDB 將自動(dòng)創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù),Song.mp3 是上傳文件名。要想查看數(shù)據(jù)庫(kù)中文件的文檔,使用 find()
查詢:
>db.fs.files.find()
返回結(jié)果文檔如下所示:
{
_id: ObjectId('534a811bf8b4aa4d33fdf94d'),
filename: "song.mp3",
chunkSize: 261120,
uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
length: 10401959
}
我們還可以查看 fs.chunks 集合中所有與存儲(chǔ)文件相關(guān)的塊。代碼如下,其中使用了上次查詢所返回的文檔 id。
>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})
該例中,查詢返回了 40 個(gè)文檔,這就是說(shuō)整個(gè) Mp3 文件被分解成了 40 個(gè)數(shù)據(jù)塊。