GridFS
項目一覧
このドライバーは、データベース内のチャンク ファイルのストレージを操作するためのクリーンでシンプルなインターフェースを提供します。これはパターン 「GridFS」とも呼ばれます。 API を使用すると、 Grid::File オブジェクト、または読み取りストリームと書込みストリーム(write)ストリームのいずれかを操作できます。
GridFS オブジェクトの作成(「Grid::FSbucket」)
任意の引数を使用して、データベースで fs
を呼び出すことで GridFS オブジェクトを作成できます。 fs
はGrid::FSBucket
オブジェクトを返します。
Grid::FSBucket
がサポートするオプションは次のとおりです。
オプション | 説明 |
---|---|
| GridFS バケットの名前。 デフォルトは |
| GridFS バケットの名前。 |
| データベース内の各ファイル チャンクのサイズを指定します。 |
| ファイルのアップロード時に使用する書込み保証 (write concern) です。 書込み保証 (write concern) の処理方法については、CRUD 操作の下にある書込み保証 (write concern ) セクションを参照してください。 |
| 非推奨。 |
| ファイルをダウンロードするときに使用する読み込み設定(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
書込みストリームは次のオプションをサポートしています。
オプション | 説明 |
---|---|
| データベース内の各ファイル チャンクのサイズを指定します。 |
| ファイルのアップロード時に使用する書込み保証 (write concern) です。 書込み保証 (write concern) の処理方法については、「 CRUD 操作 」の下の「 書込み保証 (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 preference)。 |
上記でリストされた読み取りメソッドの一部は、これらのオプションを基礎となる読み取りストリームに渡します。 特定のオプションをサポートしているかどうかは、各メソッドの API ドキュメントを参照してください。
ファイル メタデータの検索
GridFS ファイル コレクション内のファイルに関するメタデータを含むドキュメントを検索できます。
fs_bucket.find(filename: 'my-file.txt')
ファイルの削除
ID でファイルを削除できます。
fs_bucket.delete(file_id)
Grid::File オブジェクトの操作
このオブジェクトは、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 )
以下は、 ファイルがサポートする利用可能なオプションの完全なリストです。
オプション | 説明 |
---|---|
| データベース内の各ファイル チャンクのサイズを設定します。 |
| ファイルのコンテンツタイプを設定します。 |
| ファイル名。 |
| ファイルがアップロード(保存)された日付。 |
ファイルの挿入
データベースには一度に 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)