本章我們進行進階教程的最後一篇,GridFS的學習。在本章中,我們將要學習下述內容:
創建一個GridFS對象("Grid::FSBucket")
寫數據流處理
讀數據流處理
找到文件元數據
文件刪除
操作Grid::File對象
文件插入
文件查找
文件刪除
Ruby驅動爲數據庫中塊文件存儲的處理提供了一個簡單整潔的接口,也就是"GridFS"。這個API接口讓我們既可以使用Grid::File對象,也可以使用讀寫流。
創建一個GridFS對象("Grid::FSBucket")
在數據庫上,你可以通過調用fs並提供一系列可選參數來創建一個GridFS對象,返回一個Grid:FSBucket對象。可選參數如下表所示:
參數 | 參數描述 |
:bucket_name | 默認的GridFS Bucket名字 |
:fs_name | GridFS Bucket名字,在fs函數中覆蓋:bucket_name |
:chunk_size | 設置了數據庫中每個分塊文件的大小 |
:write | 文件上傳時使用的寫操作參數 |
:read | 問價下載時使用讀操作的首選項 |
fs_bucket=database.fs(read:{mode:secondary})
2. 寫數據流操作
通過寫操作數據流向GridFS中上傳一個文件,你可以通過打開一個流端口然後直接寫入數據,也可以同時將所有內容組合成一個IO對象一起寫入GridFS。
2.1 打開一個上傳數據流然後進行數據寫入
file=File.open('/path/to/my-file.txt','r') fs_bucket.open_upload_stream('my-file.txt') do |stream| stream.write(file) end file.close
2.2 通過將所有內容合成一個IO對象實現一次寫入
flie=File.open('/path/to/my-file.txt','r') fs_bucket.upload_from_stream('my-file.txt',file) file.close
3 讀數據流操作
使用讀數據流從GridFS下載一個文件,你可以在打開一個數據流後直接讀取,也可以一步完成文檔下載。
3.1 首先打開一個下載數據流然後直接讀取
file=File.open('/path/to/my-output-file.txt','w') fs_bucket.open_dowmload_stream(file_id) do |stream| file.write(stream.read) end file.close
3.2 直接下載文件後直接寫入到IO對象
file=File.open('/path/to/my-output-file.txt','w') fs_bucket.download_from_stream(file_id,file) file.close
同樣你也可以通過具體的一個名字及相應的版本號(可選參數)來下載文件。修訂版本號根據上傳日期排序,用於在同名文件間進行文件區分。傳遞給open_download_stream_by_name方法的修訂版本號可以是正數也可以是負數。
file=File.open('/path/to/my-output-file.txt','w') fs_bucket.open_download_stream_by_name('my-file.txt',revision:-2) do |stream| file.write(stream.read) end
通過文檔名稱和修訂版本號(可選)來下載文檔的所有內容
file=File.open('path/to/my-output-file.txt','w') fs_bucket.download_to_stream_by_name('my-file.txt',revision:-2) file.close
4 查找文檔元數據
你可以在GridFS文檔集合中檢索包含元數據的文檔
fs_bucket.find(filename:'my-file.txt')
5. 刪除文件
你可以通過id刪除文件
fs_bucket.delete(file_id)
6. 使用Grid::File對象
該對象可以用來包裹使用GridFS一個要插入數據庫的文件,而且該對象還可以被檢索。創建一個包含數據的文件。
file=Mongo::Grid::File.new('I am a file',:filename=>'new-file.txt')
創建一個Ruby文件對象:
file=File.open('/path/to/my-file.txt') grid_file=Mongo::Grid::File.new(file.read,:filename=>File.basename(file.path))
改變諸如塊大小的文件參數,給構造器傳遞對應的參數
file=File.open('/path/to/my-file.txt') grid_file=Mongo::Client.File.new( file.read, :filename=>File.basename(file.path), :chunk_size-=>1024 )
下表中列出的是文件操作支持的可選參數
參數 | 參數描述 |
:chunk_sie | 設定數據庫中每個文件塊的大小 |
:content_type | 設定文件的內容類型 |
:filename(Required) | 文件名 |
:upload_date | 文檔上傳的日期(存儲) |
7.文件插入
可以一次插入一個文檔到數據庫。塊文件默認插入到fs.chunks集合中,文件元數據插入到fs.files集合中。
client=Mongo::CLient.new(['127.0.0.1:27017'],:database=>'film') file=Mongo::Grid::File.new('I am a file',:filename=>'new-file.txt') client.database.fs.insert_one(file)
使用名稱前綴而不是fs函數,使用:fs_name參數可以訪問文件系統
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film') file=Mongo::Grid::File.new('I am a file',:filename=>'new-file.txt') client.database.fs(:fs_name=>'grid').insert_one(file)
需要注意的是文件第一次插入時,系統會自動創建塊集合上的索引。創建的是一個複合索引
{:files_id=>1,:n=>1}
同樣文件也可以被流處理後直接插入
client.database.fs.open_stream(filename) do |stream| stream.write(file) end
8. 文件查找
從數據庫中檢索一個文件,可以通過在find_one中使用合適的過濾規則實現
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film') client.database.fs.find_one(:filename=>'new-file.txt')
也可以通過流操作來進行查找
client.database.fs.open_download_stream(file_id) do |stream| io.write(stream.read) end fs.download_to_stream(file_id,io)
9. 文件刪除
使用對象的delete_one方法刪除一個文件
client=Mongo::Client.new('127.0.0.1:27017',:database=>'film') fs=client.database.fs file=fs.find_one(:filename=>'my-file.txt') fs.delete_one(file)
至此,我們完成了GridFS的學習和相關操作。