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的学习和相关操作。

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