设为首页 收藏本站
查看: 988|回复: 0

[经验分享] Ruby操作MongoDB数据库(进阶十二)--GridFS

[复制链接]

尚未签到

发表于 2018-10-25 08:13:20 | 显示全部楼层 |阅读模式
  本章我们进行进阶教程的最后一篇,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('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的学习和相关操作。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-626118-1-1.html 上篇帖子: Ruby操作MongoDB(进阶十一)--空间信息搜索Geospatial Search 下篇帖子: mongodb笔记1-Note
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表