本章我们进行进阶教程的最后一篇,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 | 问价下载时使用读操作的首选项 |
例如,你可以在给创建的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的学习和相关操作。