Ruby操作MongoDB数据库(进阶十二)--GridFS

2017-08-16 13:46:30来源:http://wanght89.blog.51cto.com/6778304/1956069作者:人点击

分享

本章我们进行进阶教程的最后一篇,GridFS的学习。在本章中,我们将要学习下述内容:

创建一个GridFS对象("Grid::FSBucket")

写数据流处理

读数据流处理

找到文件元数据

文件删除

操作Grid::File对象

文件插入

文件查找

文件删除

Ruby驱动为数据库中块文件存储的处理提供了一个简单整洁的接口,也就是"GridFS"。这个API接口让我们既可以使用Grid::File对象,也可以使用读写流。

创建一个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('Iamafile',: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('Iamafile',: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('Iamafile',: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的学习和相关操作。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台