Docs Menu
Docs Home
/ / /
Go 드라이버
/

GridFS.

이 페이지의 내용

  • 개요
  • GridFS 작동 방식
  • GridFS 작업
  • GridFS 버킷 만들기
  • 파일 업로드
  • 파일 정보 검색
  • 파일 다운로드
  • 파일 이름 바꾸기
  • 파일 삭제
  • GridFS 버킷 삭제
  • 추가 리소스
  • API 문서

이 가이드에서는 GridFS 사양을 사용하여 MongoDB에 대용량 파일을 저장하고 조회하는 방법에 대해 설명합니다. GridFS는 대용량 파일을 청크로 분할하고 각 청크를 별도의 문서로 저장합니다. GridFS에 파일을 쿼리하면 드라이버가 필요에 따라 청크를 조립합니다. GridFS의 드라이버 구현은 파일 스토리지의 운영과 구성을 관리하는 추상화입니다.

파일 크기가 BSON 문서 크기 제한인 16 MB를 초과하는 경우 GridFS 사용하세요. 또한 GridFS 사용하면 전체 파일 메모리에 로드하지 않고도 파일 액세스 .GridFS 해당 사용 사례 에 적합한지 여부에 대해 자세히 학습 서버 매뉴얼에서 GridFS 참조하세요.

GridFS는 파일 청크와 파일을 설명하는 정보가 들어 있는 MongoDB 컬렉션 그룹인 버킷에 파일을 구성합니다. 버킷에는 다음과 같은 컬렉션이 포함되어 있습니다.

  • chunks바이너리 파일 청크를 저장합니다.

  • files파일 메타데이터를 저장합니다.

새 GridFS 버킷을 생성하면 드라이버는 앞에 설명한 컬렉션을 생성합니다. 다른 버킷 이름을 지정하지 않는 한 기본 버킷 이름인 fs가 컬렉션 이름 앞에 붙습니다. 드라이버는 첫 번째 쓰기 작업 중에 새 GridFS 버킷을 생성합니다.

또한 운전자 파일 및 관련 메타데이터 를 효율적으로 검색할 수 있도록 각 컬렉션 에 인덱스 생성합니다. 인덱스가 아직 존재하지 않거나 버킷이 비어 있는 경우 운전자 인덱스를 생성합니다. GridFS 인덱스에 대해 자세히 학습 서버 매뉴얼에서 GridFS 인덱스를 참조하세요.

GridFS로 파일을 저장할 때 드라이버는 파일을 작은 청크로 분할하며, 각각의 청크는 chunks 컬렉션에서 별도의 문서로 표시됩니다. 또한 files 컬렉션에 파일 ID, 파일 이름 및 기타 파일 메타데이터가 포함된 문서를 만듭니다. 다음 다이어그램은 GridFS가 업로드된 파일을 분할하는 방법을 보여줍니다.

GridFS가 파일을 버킷에 업로드하는 방법을 보여주는 다이어그램입니다.

GridFS는 파일을 조회할 때 지정된 버킷의 files 컬렉션에서 메타데이터를 가져온 다음, 해당 정보를 사용하여 chunks 컬렉션의 문서에서 파일을 재구성합니다. 파일을 메모리에 입력하거나 스트림에 출력할 수 있습니다.

다음 섹션에서는 GridFS 작업을 수행하는 방법에 대해 설명합니다.

GridFS에서 파일을 저장하거나 조회하려면 버킷을 만들거나 MongoDB Database에서 기존 버킷에 대한 참조를 가져오면 됩니다. GridFSBucket 인스턴스를 생성하려면 다음 코드와 같이 Database 인스턴스에서 GridFSBucket() 메서드를 호출합니다.

db := client.Database("myDB")
bucket := db.GridFSBucket()

참고

GridFS 버킷이 이미 있는 경우 GridFSBucket() 메서드는 새 버킷을 인스턴스화하는 대신 버킷에 대한 참조를 반환합니다.

기본적으로 드라이버는 버킷의 이름을 fs로 설정합니다. 사용자 지정 이름으로 버킷을 생성하려면 다음 코드에 표시된 대로 BucketOptions 인스턴스에서 SetName() 메서드를 호출합니다.

db := client.Database("myDB")
bucketOpts := options.GridFSBucket().SetName("myCustomBucket")
bucket := db.GridFSBucket(bucketOpts)

다음 메서드 중 하나를 사용하여 GridFS 버킷에 파일을 업로드할 수 있습니다.

  • UploadFromStream()입력 스트림에서 읽습니다.

  • OpenUploadStream()출력 스트림에 씁니다.

두 업로드 프로세스 모두에서 인스턴스 만들어 구성 정보를 지정할 수 UploadOptions 있습니다. 전체 옵션 목록을 보려면 UploadOptions API 설명서를 참조하세요.

입력 스트림을 사용하여 파일을 업로드하려면 다음 매개변수와 함께 UploadFromStream() 메서드를 사용합니다.

  • 파일 이름

  • io.Reader 열린 파일을 매개변수로 포함하는 인스턴스

  • opts 다음의 동작을 수정하는 매개변수 UploadFromStream()

다음 코드 예시는 file.txt라는 파일을 읽고, opts 매개변수를 만들어 파일 메타데이터를 설정한 다음, 콘텐츠를 GridFS 버킷에 업로드합니다.

file, err := os.Open("home/documents/file.txt")
uploadOpts := options.GridFSUpload().SetMetadata(bson.D{{"metadata tag", "first"}})
objectID, err := bucket
.UploadFromStream(
"file.txt",
io.Reader(file),
uploadOpts
)
if err != nil {
panic(err)
}
fmt.Printf("New file uploaded with ID %s", objectID)
New file uploaded with ID ...

출력 스트림을 사용하여 파일을 업로드하려면 다음 매개변수와 함께 OpenUploadStream() 메서드를 사용합니다.

  • 파일 이름

  • opts 다음의 동작을 수정하는 매개변수 OpenUploadStream()

다음 코드 예시에서는 GridFS 버킷에서 업로드 스트림을 열고 옵션 매개변수에서 각 청크의 바이트 수를 설정합니다. 그러면 file.txt의 콘텐츠에 Write() 메서드가 호출되어 해당 콘텐츠가 스트림에 기록됩니다.

file, err := os.Open("home/documents/file.txt")
if err != nil {
panic(err)
}
// Defines options that specify configuration information for files
// uploaded to the bucket
uploadOpts := options.GridFSUpload().SetChunkSizeBytes(200000)
// Writes a file to an output stream
uploadStream, err := bucket.OpenUploadStream("file.txt", uploadOpts)
if err != nil {
panic(err)
}
fileContent, err := io.ReadAll(file)
if err != nil {
panic(err)
}
var bytes int
if bytes, err = uploadStream.Write(fileContent); err != nil {
panic(err)
}
fmt.Printf("New file uploaded with %d bytes written", bytes)
// Calls the Close() method to write file metadata
if err := uploadStream.Close(); err != nil {
panic(err)
}

GridFS 버킷의 files 컬렉션에 저장된 파일 메타데이터를 조회할 수 있습니다. files 컬렉션의 각 문서에는 다음 정보가 포함되어 있습니다.

  • 파일 ID

  • 파일 길이

  • 최대 청크 크기

  • 업로드 날짜 및 시간

  • 파일 이름

  • metadata 기타 정보를 저장하는 문서

파일 데이터를 조회하려면 GridFSBucket 인스턴스에서 Find() 메서드를 호출합니다. 특정 파일 문서만 일치시키려면 쿼리 필터를 Find()에 인수로 전달하면 됩니다.

참고

쿼리 필터를 Find() 메서드에 전달해야 합니다. files 컬렉션의 모든 문서를 조회하려면 빈 쿼리 필터를 Find()에 전달합니다.

다음 예에서는 length 값이 1500보다 큰 문서의 파일 이름과 길이를 조회합니다.

filter := bson.D{{"length", bson.D{{"$gt", 1500}}}}
cursor, err := bucket.Find(filter)
if err != nil {
panic(err)
}
type gridFSFile struct {
Name string `bson:"filename"`
Length int64 `bson:"length"`
}
var foundFiles []gridFSFile
if err = cursor.All(context.TODO(), &foundFiles); err != nil {
panic(err)
}
for _, file := range foundFiles {
fmt.Printf("filename: %s, length: %d\n", file.Name, file.Length)
}

다음 메서드 중 하나를 사용하여 GridFS 파일을 다운로드할 수 있습니다.

  • DownloadToStream()출력 스트림으로 파일을 다운로드합니다.

  • OpenDownloadStream()입력 스트림을 엽니다.

DownloadToStream() 메서드를 사용하여 GridFS 버킷의 파일을 출력 스트림에 직접 다운로드할 수 있습니다. DownloadToStream() 메서드는 파일 ID와 io.Writer 인스턴스를 매개변수로 사용합니다. 이 메서드는 지정된 파일 ID를 가진 파일을 다운로드하여 io.Writer 인스턴스에 씁니다.

다음은 파일을 다운로드하여 파일 버퍼에 기록하는 예입니다.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
fileBuffer := bytes.NewBuffer(nil)
if _, err := bucket.DownloadToStream(id, fileBuffer); err != nil {
panic(err)
}

OpenDownloadStream() 메서드를 사용하여 입력 스트림을 통해 GridFS 버킷의 파일을 메모리에 다운로드할 수 있습니다. OpenDownloadStream() 메서드는 파일 ID를 매개변수로 사용하여 파일을 읽을 수 있는 입력 스트림을 반환합니다.

다음 예에서는 파일을 메모리에 다운로드하고 해당 콘텐츠를 읽습니다.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
downloadStream, err := bucket.OpenDownloadStream(id)
if err != nil {
panic(err)
}
fileBytes := make([]byte, 1024)
if _, err := downloadStream.Read(fileBytes); err != nil {
panic(err)
}

Rename() 메서드를 사용하여 버킷에 있는 GridFS 파일의 이름을 업데이트할 수 있습니다. 파일 ID 값과 새 filename 값을 인수로 Rename()에 전달합니다.

다음 예에서는 파일 이름을 "mongodbTutorial.zip"으로 변경합니다.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Rename(id, "mongodbTutorial.zip"); err != nil {
panic(err)
}

Delete() 메서드를 사용하여 GridFS 버킷에서 파일을 제거할 수 있습니다. 파일 ID 값을 인수로 Delete()에 전달합니다.

다음은 파일을 삭제하는 예입니다.

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Delete(id); err != nil {
panic(err)
}

Drop() 메서드를 사용하여 GridFS 버킷을 삭제할 수 있습니다.

다음 코드 예시에서는 GridFS 버킷을 삭제합니다.

if err := bucket.Drop(); err != nil {
panic(err)
}

GridFS 및 스토리지에 대해 자세히 알아보려면 서버 매뉴얼의 다음 페이지를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

연결 모니터링