Ruby操作MongoDB數據庫(進階十二)--GridFS

本章我們進行進階教程的最後一篇,GridFS的學習。在本章中,我們將要學習下述內容:

創建一個GridFS對象("Grid::FSBucket")

  • 寫數據流處理

  • 讀數據流處理

  • 找到文件元數據

  • 文件刪除

  • 操作Grid::File對象

  • 文件插入

  • 文件查找

  • 文件刪除

  Ruby驅動爲數據庫中塊文件存儲的處理提供了一個簡單整潔的接口,也就是"GridFS"。這個API接口讓我們既可以使用Grid::File對象,也可以使用讀寫流。

  1. 創建一個GridFS對象("Grid::FSBucket")

  在數據庫上,你可以通過調用fs並提供一系列可選參數來創建一個GridFS對象,返回一個Grid:FSBucket對象。可選參數如下表所示:

參數參數描述
:bucket_name默認的GridFS Bucket名字
:fs_nameGridFS Bucket名字,在fs函數中覆蓋:bucket_name
:chunk_size設置了數據庫中每個分塊文件的大小
:write文件上傳時使用的寫操作參數
:read問價下載時使用讀操作的首選項
例如,你可以在給創建的GridFS:Bucket設定一個特定的讀操作首選項:
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的學習和相關操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章