GridFS.
GridFS는 BSON 문서 크기 제한인 16 MB를 초과하는 파일을 저장하고 검색하기 위한 사양입니다. GridFS는 대용량 파일을 단일 문서에 저장하는 대신 파일을 여러 부분 또는 청크로 나누고 각 청크를 별도의 문서로 저장합니다.
GridFS 저장소에 파일을 쿼리하면 드라이버가 필요에 따라 청크를 리어셈블합니다.
이 가이드의 코드 예제는 GridFSTour.java 파일을 드라이버 소스 코드 Github 리포지토리에 저장합니다.
전제 조건
이 가이드의 코드 예제를 실행하려면 프로그램에 다음 가져오기 문을 포함해야 합니다.
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.gridfs.model.*; import com.mongodb.reactivestreams.client.gridfs.*; import org.bson.Document; import org.bson.types.ObjectId; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import static com.mongodb.client.model.Filters.eq; import static reactivestreams.helpers.PublisherHelpers.toPublisher;
중요
이 가이드에서는 퀵 스타트 프라이머에 설명된 Subscriber
구현을 사용합니다.
MongoDB 배포에 연결하기
먼저, MongoDB 배포서버에 연결하고 MongoDatabase
인스턴스를 선언 및 정의합니다.
다음 코드는 포트 27017
의 localhost
에서 실행되는 독립형 MongoDB 배포서버에 연결합니다.
MongoClient mongoClient = MongoClients.create();
MongoDB deployment에 연결하는 방법에 대해 자세히 알아보려면 MongoDB에 연결 튜토리얼을 참조하세요.
GridFS 버킷 만들기
GridFS는 두 개의 컬렉션에 파일을 저장합니다.
chunks
: 파일 청크를 저장합니다.files
: 파일 메타데이터를 저장합니다.
두 컬렉션은 공통 버킷에 있으며 컬렉션 이름 앞에 버킷 이름이 붙습니다.
드라이버는 GridFSBucket
인스턴스를 생성하는 GridFSBuckets.create()
메서드를 제공합니다.
MongoDatabase myDatabase = mongoClient.getDatabase("mydb"); // Create a gridFSBucket using the default bucket name "fs" GridFSBucket gridFSBucket = GridFSBuckets.create(myDatabase);
버킷 이름을 GridFSBuckets.create()
메서드에 전달할 수 있습니다.
// Create a gridFSBucket with a custom bucket name "files" GridFSBucket gridFSFilesBucket = GridFSBuckets.create(myDatabase, "files");
참고
GridFS는 사용자가 GridFS 버킷에 데이터를 업로드할 때 files
및 chunks
컬렉션에 인덱스를 자동으로 생성합니다.
GridFS에 업로드
GridFSBucket.uploadFromPublisher()
메서드는 Publisher<ByteBuffer>
의 내용을 읽고 이를 GridFSBucket
인스턴스에 저장합니다.
GridFSUploadOptions
유형을 사용하여 청크 크기를 구성하거나 추가 메타데이터를 포함할 수 있습니다.
다음 예에서는 Publisher<ByteBuffer>
의 콘텐츠를 GridFSBucket
에 업로드합니다.
// Get the input publisher Publisher<ByteBuffer> publisherToUploadFrom = toPublisher( ByteBuffer .wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8)) ); // Create some custom options GridFSUploadOptions options = new GridFSUploadOptions() .chunkSizeBytes(1024) .metadata(new Document("type", "presentation")); ObservableSubscriber<ObjectId> uploadSubscriber = new OperationSubscriber<>(); gridFSBucket.uploadFromPublisher("mongodb-tutorial", publisherToUploadFrom, options).subscribe(uploadSubscriber); ObjectId fileId = uploadSubscriber.get().get(0);
GridFS에 저장된 파일 찾기
GridFSBucket
에 저장된 파일을 찾으려면 find()
메서드를 사용합니다.
다음 예제에서는 저장된 각 파일의 파일 이름을 출력합니다.
ConsumerSubscriber<GridFSFile> filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println(" - " + gridFSFile.getFilename())); gridFSBucket.find().subscribe(filesSubscriber); filesSubscriber.await();
사용자 지정 필터를 제공하여 반환되는 결과를 제한할 수도 있습니다. 다음 예에서는 사용자 정의 메타데이터 문서에서 contentType
값이 image/png
값인 모든 파일의 파일 이름을 출력합니다.
filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println("Found: " + gridFSFile.getFilename())); gridFSBucket.find(eq("metadata.contentType", "image/png")).subscribe(filesSubscriber); filesSubscriber.await();
GridFS에서 다운로드
downloadToPublisher()
메서드는 MongoDB에서 콘텐츠를 읽는 Publisher<ByteBuffer>
을 반환합니다.
파일을 기준으로 _id
파일을 다운로드하려면 _id
을 메서드에 전달합니다. 다음 예제에서는 _id
파일별로 파일을 다운로드합니다.
ObjectId fileId; ObservableSubscriber<ByteBuffer> downloadSubscriber = new OperationSubscriber<>(); gridFSBucket.downloadToPublisher(fileId).subscribe(downloadSubscriber);
파일의 _id
는 몰라도 파일 이름은 알고 있는 경우 파일 이름을 downloadToPublisher()
메서드에 전달할 수 있습니다. 기본적으로 최신 버전의 파일을 다운로드합니다. GridFSDownloadOptions
클래스를 사용하여 다운로드할 버전을 구성합니다.
다음 예에서는 mongodb-tutorial
파일의 원본 버전을 다운로드합니다.
GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0); downloadSubscriber = new OperationSubscriber<>(); gridFSBucket.downloadToPublisher("mongodb-tutorial", downloadOptions).subscribe(downloadSubscriber);
파일 이름 바꾸기
파일 이름을 변경해야 하는 경우 rename()
메서드를 사용하세요.
다음 예에서는 파일 이름을 mongodbTutorial
으로 변경합니다.
ObjectId fileId; //ObjectId of a file uploaded to GridFS gridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());
참고
rename()
메서드에는 올바른 파일 이름이 변경되도록 하기 위해 filename
ObjectId
이(가) 필요합니다.
동일한 파일 이름의 여러 수정본 이름을 바꾸려면 먼저 파일의 전체 목록을 조회합니다. 그런 다음 이름을 바꿔야 하는 모든 파일에 대해 해당 _id
을 사용하여 rename()
를 실행합니다.
파일 삭제
GridFSBucket
에서 파일을 삭제하려면 delete()
메서드를 사용합니다.
다음 예에서는 GridFSBucket
에서 파일을 삭제합니다.
ObjectId fileId; //ObjectId of a file uploaded to GridFS gridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());