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

时间: 2024-11-13 06:39:27

Ruby操作MongoDB数据库(进阶十二)--GridFS的相关文章

Ruby操作MongoDB(进阶十一)--空间信息搜索Geospatial Search

上篇博文中介绍了,文本搜索的相应功能. MongoDB数据库为空间信息的处理操作提供了一系列的索引和查询机制.本篇博文将在Ruby驱动上展示如何创建和适用空间索引.下面的实例使用了test数据库中的一个叫做restaurants的简单集合. 下面是restaurants集合 {  "address":{        "building":"1007",        "coord":[-73.856077,40.848447

Ruby操作MongoDB(进阶五)-数据库管理Administration

通过前面四章的学习,本章我们开始学习Ruby操作MongoDB数据库中的数据管理Administration 数据库相关 Ruby驱动为数据库对象执行命令,获取集合列表,和管理任务提供了多种多样的帮助. 1.1 获取集合列表List Collection 通过collections和collection_names两个指令可以获取集合列表和集合的名字.例如: client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'film') datab

Windows下如何实现Ruby操作MongoDB(环境安装配置)

最近在研究使用非关系型数据库,当前使用的是文档型数据库MongoDB.涉及到在Windows环境下使用Ruby操作MongoDB数据库.因此需在Windows环境下安装Ruby开发环境. 按照如下步骤进行操作: 1. 首先安装ruby 到http://rubyinstaller.org/downloads/下载相关软件:下载对应电脑所需的RubyInstaller版本.作者选中的是Ruby2.3.3(x64),url对应界面如下图所示: 成功下载安装包后,直接点击安装,可勾选所有选项,安装时必须

二十六、Nodejs 操作 MongoDb 数据库

一. 在 Nodejs 中使用 Mongodb 前面的课程我们讲了用命令操作 MongoDB,这里我们看下如何用 nodejs 来操作数据库需要引包: npm install mongodb --save-dev / cnpm install mongodb --save-dev mongodb官方文档网址: https://docs.mongodb.com/manual/ 进入下面的页面,你就可以选择你使用的开发语言的操作mongodb的文档,注意,一般很难加载出来的... node.js操作

Ruby操作MongoDB(进阶)-CRUD操作

MongDB数据库的使用离不开CRUD操作.什么是CRUD,就是创建文档,读取文档信息,更新文档和删除文档. key-value键值对标记 在MongoDB的Ruby驱动中,Key_value键值多次出现.而且有时会出现语法上的巧合,这取决于在使用的Ruby版本中如何申明. 在文档创建步骤中,1.9及之后版本支持以下语法: document={name:"Tom",age:20}. 但是如果你使用的是2.2或者更高的版本,你可以用双引号将你的key包起来.如: document={&q

Ruby操作MongoDB(进阶七)-排序规则Collations

本篇博文从三个方面进行排序规则Collations的讲解.其中包括概览,使用方式和支持排序的操作.首先我们对排序规则进行一个概览性的介绍 排序规则概览 排序规则为特定语言习惯中的字符串比较提供一套规则,例如,在加拿大法语中,给定词汇的最后一个重音节决定了其排序顺序. 考虑下述法语词汇: cote < coté < cte < cté 使用加拿大法语排序规则,得到如下排序结果 cote < cte < coté < cté 如果没有指定排序规则,MongoDB使用简单的二

PHP操作MongoDB数据库

一.MongoDB简介 MongoDB (名称来自"humongous") 是一个可扩展的.高性能.开源.模式自由.面向文档的数据库,集文档数据库.键值对存储和关系型数据库的优点于一身. 官方站点: https://www.mongodb.org MongoDB特点: ? 面向文档存储(类JSON数据模式简单而强大)? 动态查询? 全索引支持,扩展到内部对象和内嵌数组? 查询记录分析? 快速,就地更新? 高效存储二进制大对象 (比如照片和视频)? 复制和故障切换支持? Auto-Sha

8.3 操作MongoDB数据库

一项权威调查显示,在大数据时代软件开发人员必备的十项技能中MongoDB数据库名列第二,仅次于HTML5.MongoDB是一个基于分布式文件存储的文档数据库,可以说是非关系型(Not Only SQL,NoSQL)数据库中比较像关系型数据库的一个,具有免费.操作简单.面向文档存储.自动分片可扩展性强.查询功能强大等特点,对大数据处理支持较好,旨在为Web应用提供可扩展的高性能数据存储解决方案.MongoDB将数据存储为一个文档,数据结构由键值(key -> value)对组成.MongoDB文档

node操作MongoDB数据库之插入

在上一篇中我们介绍了MongoDB的安装与配置,接下来的我们来看看在node中怎样操作MongoDB数据库. 在操作数据库之前,首先应该像关系型数据库一样建个数据库把... 启动数据库 利用命令提示符: 1.在创建数据库之前,我们应该启动数据库服务器 mongod --dbpath d:\MongoDB\data 注意:不要关闭这个数据库服务器...不然数据库就被关闭了 2.使用如下语句创建一个数据库 use mydb 这样mongodb会帮助我们自动创建他们,当然这个时候数据库还是空的. 3.