Docs Menu
Docs Home
/ / /
Ruby MongoDB ドライバー
/

GridFS

項目一覧

  • GridFS オブジェクトの作成(「Grid::FSbucket」)
  • 書込みストリームの操作
  • 読み取りストリームの操作
  • ファイル メタデータの検索
  • ファイルの削除
  • Grid::File オブジェクトの操作
  • ファイルの挿入
  • ファイルの検索
  • ファイルの削除

このドライバーは、データベース内のチャンク ファイルのストレージを操作するためのクリーンでシンプルなインターフェースを提供します。これはパターン 「GridFS」とも呼ばれます。 API を使用すると、 Grid::File オブジェクト、または読み取りストリームと書込みストリーム(write)ストリームのいずれかを操作できます。

任意の引数を使用して、データベースで fsを呼び出すことで GridFS オブジェクトを作成できます。 fsGrid::FSBucketオブジェクトを返します。

Grid::FSBucketがサポートするオプションは次のとおりです。

オプション
説明
:bucket_name
GridFS バケットの名前。 デフォルトはfsです。
:fs_name
GridFS バケットの名前。 bucket_nameよりも優先されます。 デフォルトはfsです。
:chunk_size
データベース内の各ファイル チャンクのサイズを指定します。
:write_concern
ファイルのアップロード時に使用する書込み保証 (write concern) です。 書込み保証 (write concern) の処理方法については、CRUD 操作の下にある書込み保証 (write concern ) セクションを参照してください。
:write
非推奨。 :write_concernと同じ。
:read
ファイルをダウンロードするときに使用する読み込み設定(read preference)。

たとえば、特定の読み込み設定(read preference)を持つ GridFS バケット オブジェクトを作成できます。

fs_bucket = database.fs( read: { mode: :secondary } )

書込みストリームを使用して GridFS にファイルをアップロードするには、ストリームを開いてそのストリームに直接書込むか、 IOオブジェクトのコンテンツ全体を一度に GridFS に書込みます。

アップロード ストリームを開き、そのストリームに書き込む方法は、次のとおりです。

File.open('/path/to/my-file.txt', 'r') do |file|
fs_bucket.open_upload_stream('my-file.txt') do |stream|
stream.write(file)
end
end

1 回の呼び出しで IO オブジェクトのコンテンツ全体をアップロードするには、次の手順に従います。

File.open('/path/to/my-file.txt', 'r') do |file|
fs_bucket.upload_from_stream('my-file.txt', file)
end

書込みストリームは次のオプションをサポートしています。

オプション
説明
:chunk_size
データベース内の各ファイル チャンクのサイズを指定します。
:write_concern
ファイルのアップロード時に使用する書込み保証 (write concern) です。 書込み保証 (write concern) の処理方法については、「 CRUD 操作 」の下の「 書込み保証 (write concern ) 」セクションを参照してください。
:write
非推奨。 :write_concernと同じ。

オプションは、書込みストリーム メソッドの最後の引数として提供できます。

fs_bucket.open_upload_stream('my-file.txt', write_concern: {w: 2}) do |stream|
stream.write_concern
# => #<Mongo::WriteConcern::Acknowledged:0x46980201422160 options={:w=>2}>
# ...
end
fs_bucket.upload_from_stream('my-file.txt', file, write_concern: {w: 2})

読み取りストリームを使用して GridFS からファイルをダウンロードするには、読み取りストリームを開き、そのストリームから直接読み取るか、ファイル全体を一度にダウンロードします。

ダウンロード ストリームを開いて読み取るには次の手順に従います。

File.open('/path/to/my-output-file.txt', 'w') do |file|
fs_bucket.open_download_stream(file_id) do |stream|
file.write(stream.read)
end
end

ファイルを一度にダウンロードし、IO オブジェクトに書込むには、次の手順に従います。

File.open('/path/to/my-output-file.txt', 'w') do |file|
fs_bucket.download_from_stream(file_id, file)
end

また、名前と(任意)リビジョニングされたファイルをダウンロードすることもできます。 バージョン番号は、アップロード日の順に同じ名前を共有するファイルを区別するために使用されます。 open_download_stream_by_nameに渡されるリビルド番号は正または負の値になります。

File.open('/path/to/my-output-file.txt', 'w') do |file|
fs_bucket.open_download_stream_by_name('my-file.txt', revision: -2) do |stream|
file.write(stream.read)
end
end

名前と(任意)リダイレクト番号で指定されたファイルのコンテンツ全体をダウンロードするには:

File.open('/path/to/my-output-file.txt', 'w') do |file|
fs_bucket.download_to_stream_by_name('my-file.txt', file, revision: -2)
end

読み取りストリームは次のオプションをサポートしています。

オプション
説明
:read
ファイルをダウンロードするときに使用する読み込み設定(read preference)。

上記でリストされた読み取りメソッドの一部は、これらのオプションを基礎となる読み取りストリームに渡します。 特定のオプションをサポートしているかどうかは、各メソッドの API ドキュメントを参照してください。

GridFS ファイル コレクション内のファイルに関するメタデータを含むドキュメントを検索できます。

fs_bucket.find(filename: 'my-file.txt')

ID でファイルを削除できます。

fs_bucket.delete(file_id)

このオブジェクトは、GridFS と検索されたオブジェクトを使用してデータベースに挿入するファイルをラップするために使用できます。

未加工データを含むファイルを作成するには

file = Mongo::Grid::File.new('I am a file', :filename => 'new-file.txt')

Ruby Fileオブジェクトから ファイルを作成するには

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::Grid::File.new(
file.read,
:filename => File.basename(file.path),
:chunk_size => 1024
)

以下は、 ファイルがサポートする利用可能なオプションの完全なリストです。

オプション
説明
:chunk_size
データベース内の各ファイル チャンクのサイズを設定します。
:content_type
ファイルのコンテンツタイプを設定します。
:filename (必須)
ファイル名。
:upload_date
ファイルがアップロード(保存)された日付。

データベースには一度に 1 つずつファイルを挿入できます。 ファイル チャンクはデフォルトでfs.chunksコレクションに挿入され、ファイル メタデータはfs.filesコレクションに挿入されます。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
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 => 'music')
file = Mongo::Grid::File.new('I am a file', :filename => 'new-file.txt')
client.database.fs(:fs_name => 'grid').insert_one(file)

ドライバーは最初のファイルをバケットに挿入するときに、files コレクションとchunks コレクションに必要なインデックスを作成しようとします。必要なインデックスは次のとおりです。

# files collection
{ :filename => 1, :uploadDate => 1 }
# chunks collection
{ :files_id => 1, :n => 1 }, { :unique => true }

注意

現在のユーザーにインデックスを作成する権限がない場合など、インデックスを作成できない場合、ファイルの挿入は中止されます。 アプリケーションにインデックスを作成する権限がない場合は、データベース管理者が必要なインデックスを事前に作成する必要があります。

バケットにすでにファイルがある場合、ドライバーはインデックスを作成しようとしません。ただし、それらが欠落しており、現在のユーザーがインデックスを作成する権限を持っている場合でも、 この場合、データベース管理者は、データの整合性を確保するために、必要なインデックスをできるだけ早く作成する必要があります。

直接挿入の代わりに、ファイルをストリーミングすることもできます。

client.database.fs.open_upload_stream(filename) do |stream|
stream.write(file)
end

データベースからファイルを検索するには、適切なフィルターを指定してfind_oneを呼び出します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
client.database.fs.find_one(:filename => 'new-file.txt') # Returns a Mongo::Grid::File

直接検索の代わりに、ファイルをストリーミングすることもできます。

client.database.fs.open_download_stream(file_id) do |stream|
io.write(stream.read)
end
fs.download_to_stream(file_id, io)

ファイルを削除するには、ファイル オブジェクトをdelete_oneに渡します。

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music')
fs = client.database.fs
file = fs.find_one(:filename => 'new-file.txt')
fs.delete_one(file)

戻る

クエリ キャッシュ