GridFS.
이 페이지의 내용
이 드라이버는 데이터베이스의 청크 파일 저장("GridFS" 패턴이라고도 함) 작업을 위한 깔끔하고 간단한 인터페이스를 제공합니다. API를 사용하면 Grid::File 객체 또는 읽기 및 쓰기 스트림으로 작업할 수 있습니다.
GridFS 객체 만들기("Grid::FSBucket")
선택적 인수를 사용하여 데이터베이스에서 fs
을(를) 호출하여 GridFS 객체를 만들 수 있습니다. fs
은(는) Grid::FSBucket
객체를 반환합니다.
Grid::FSBucket
에서 지원하는 옵션은 다음과 같습니다.
옵션 | 설명 |
---|---|
:bucket_name | GridFS 버킷의 이름입니다. 기본값은 fs 입니다. |
:fs_name | GridFS 버킷의 이름입니다. bucket_name 보다 우선합니다. 기본값은 fs 입니다. |
:chunk_size | 데이터베이스에 있는 각 파일 청크의 크기를 지정합니다. |
:write_concern | 파일을 업로드할 때 사용할 쓰기 고려 (write concern) 입니다. 쓰기 (write) 고려 작업 방법은 CRUD 작업 아래의 쓰기 고려 섹션을 참조하세요. |
: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
한 번의 호출로 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)
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 )
다음은 파일에서 지원하는 사용 가능한 옵션의 전체 목록입니다.
옵션 | 설명 |
---|---|
:chunk_size | 데이터베이스에 있는 각 파일 청크의 크기를 설정합니다. |
:content_type | 파일의 콘텐츠 유형을 설정합니다. |
:filename (필수) | 파일 이름입니다. |
:upload_date | 파일이 업로드(저장)된 날짜입니다. |
파일 삽입
파일은 한 번에 하나씩 데이터베이스에 삽입할 수 있습니다. 파일 청크는 기본적으로 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
이외의 이름 접두사를 사용하여 collection에 삽입하려면 :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
collection에 필요한 인덱스를 생성하려고 시도합니다. 필수 인덱스는 다음과 같습니다.
# 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)