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

대용량 파일 저장

이 페이지의 내용

  • 개요
  • GridFS 작동 방식
  • GridFS 버킷 만들기
  • 버킷 사용자 지정
  • 파일 업로드
  • 업로드 스트림에 쓰기
  • 기존 스트림 업로드
  • 파일 정보 검색
  • 예시
  • 파일 다운로드
  • 다운로드 스트림에서 읽기
  • 기존 스트림에 다운로드
  • 파일 삭제
  • API 문서

이 가이드 에서는 GridFS 를 사용하여 MongoDB 에 대용량 파일을 저장 하고 조회 하는 방법을 학습 수 있습니다. GridFS 는 C 운전자 에 의해 구현된 사양으로, 파일을 저장할 때 청크로 분할 하고 검색할 때 다시 조립하는 방법을 설명합니다. 드라이버의 GridFS 구현 은 파일 저장 의 운영 및 조직 을 관리하는 추상화입니다.

파일 크기가 BSON 문서 크기 제한인 16MB를 초과하는 경우 GridFS 를 사용하세요. GridFS 가 사용 사례 에 적합한지 여부에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 를 참조하세요.

GridFS는 파일 청크와 파일을 설명하는 정보가 들어 있는 MongoDB 컬렉션 그룹인 버킷에 파일을 구성합니다. 버킷에는 GridFS 사양에 정의된 규칙을 사용하여 명명된 다음 컬렉션이 포함되어 있습니다.

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

  • files 0} 컬렉션에 파일 메타데이터가 저장됩니다.

운전자 는 첫 번째 쓰기 (write) 작업을 수행할 때 GridFS 버킷을 생성합니다(존재하지 않는 경우). 버킷에는 다른 이름을 지정하지 않는 한 기본값 버킷 이름 fs 접두사가 붙은 앞의 collection이 포함되어 있습니다. 파일 및 관련 메타데이터 를 효율적으로 검색하기 위해 운전자 는 컬렉션이 존재하지 않거나 버킷이 비어 있는 경우 각 컬렉션 에 인덱스 도 생성합니다.

GridFS 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 인덱스를 참조하세요.

GridFS 를 사용하여 파일을 저장 때 운전자 는 파일을 작은 청크로 분할하며, 각 청크는 chunks 컬렉션 에서 별도의 문서 로 표시됩니다. 또한 files 컬렉션 에 파일 ID, 파일 이름 및 기타 파일 메타데이터 가 포함된 문서 를 만듭니다. C 운전자 에 스트림 을 전달하여 소비하거나 새 스트림 을 생성하고 직접 작성하여 파일 을 업로드할 수 있습니다.

다음 다이어그램은 파일이 버킷에 업로드될 때 GridFS 가 파일을 분할하는 방법을 보여줍니다.

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

GridFS 에서 파일을 조회 할 때 지정된 버킷의 files 컬렉션 에서 메타데이터 를 가져오고 이 정보를 사용하여 chunks 컬렉션 의 문서에서 파일 을 재구성합니다. 파일 내용을 기존 스트림 에 쓰거나 파일 을 가리키는 새 스트림 을 만들어 파일 을 읽을 수 있습니다.

GridFS 를 사용하려면 먼저 mongoc_gridfs_bucket_new() 함수를 호출합니다. 이 함수는 새 mongoc_gridfs_bucket_t 구조를 만들거나 기존 mongoc_gridfs_bucket_t 에 액세스하고 다음 매개 변수를 허용합니다.

  • 데이터베이스: 버킷을 생성할 데이터베이스 를 지정합니다.

  • 옵션 문서: 버킷을 사용자 지정하는 옵션을 지정하거나 NULL

  • 읽기 기본 설정: 읽기 작업에 사용할 읽기 설정 (read preference)NULL 을 지정하거나 을 지정하여 데이터베이스의 읽기 설정 (read preference) 을 상속합니다.

  • 오류 위치: 오류 값의 위치 를 지정하거나 NULL

다음 예시 에서는 mongoc_gridfs_bucket_new() 함수를 호출하고 db 데이터베이스 를 매개 변수로 전달합니다.

mongoc_database_t *db = mongoc_client_get_database (client, "db");
bson_error_t error;
if (!mongoc_gridfs_bucket_new (db, NULL, NULL, &error)) {
fprintf (stderr, "Failed to create bucket: %s\n", error.message);
}

옵션 값을 지정하는 BSON 문서 를 mongoc_gridfs_bucket_new() 함수에 전달하여 GridFS 버킷 구성을 사용자 지정할 수 있습니다. 다음 표에서는 문서 에서 설정하다 수 있는 옵션에 대해 설명합니다.

옵션
설명

bucketName

Specifies the bucket name to use as a prefix for the files and chunks collections. The default value is "fs".
Type: string

chunkSizeBytes

Specifies the chunk size that GridFS splits files into. The default value is 255 kB.
Type: int32

readConcern

Specifies the read concern to use for bucket operations. The default value is the database's read concern.
Type: mongoc_read_concern_t

writeConcern

Specifies the write concern to use for bucket operations. The default value is the database's write concern.
Type: mongoc_write_concern_t

다음 예시 에서는 bucketName 옵션을 설정하는 mongoc_gridfs_bucket_new() 에 옵션 문서 를 전달하여 "myCustomBucket" 이라는 이름의 버킷을 만듭니다.

mongoc_database_t *db = mongoc_client_get_database (client, "db");
bson_t opts = BSON_INITIALIZER;
BSON_APPEND_UTF8 (&opts, "bucketName", "myCustomBucket");
bson_error_t error;
if (!mongoc_gridfs_bucket_new (db, &opts, NULL, &error)) {
fprintf (stderr, "Failed to create bucket: %s\n", error.message);
}

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

  • mongoc_gridfs_bucket_open_upload_stream(): 파일 콘텐츠를 쓰기 (write) 수 있는 새 업로드 스트림 을 엽니다.

  • mongoc_gridfs_bucket_upload_from_stream(): 기존 스트림 의 콘텐츠를 GridFS 파일 에 업로드합니다.

mongoc_gridfs_bucket_open_upload_stream() 함수를 사용하여 지정된 파일 이름에 대한 업로드 스트림 을 만듭니다. mongoc_gridfs_bucket_open_upload_stream() 함수를 사용하면 옵션 문서 에서 구성 정보를 지정할 수 있으며, 이 정보를 매개변수로 전달할 수 있습니다.

이 예시 에서는 업로드 스트림 을 사용하여 다음 조치를 수행합니다.

  • 다음 이름의 새 GridFS 파일 에 대한 쓰기 가능한 스트림 을 엽니다. "my_file"

  • mongoc_stream_write() 함수를 호출하여 스트림 이 가리키는 "my_file" 에 데이터를 쓰기 (write) .

  • mongoc_stream_close()mongoc_stream_destroy() 함수를 호출하여 "my_file"를 가리키는 스트림 을 닫고 파기합니다.

bson_error_t error;
mongoc_stream_t *upload_stream = mongoc_gridfs_bucket_open_upload_stream (bucket, "my_file", NULL, NULL, &error);
if (upload_stream == NULL) {
fprintf (stderr, "Failed to create upload stream: %s\n", error.message);
} else {
const char *data = "Data to store";
mongoc_stream_write (upload_stream, data, strlen(data), -1);
}
mongoc_stream_close (upload_stream);
mongoc_stream_destroy (upload_stream);

mongoc_gridfs_bucket_upload_from_stream() 함수를 사용하여 스트림 의 내용을 새 GridFS 파일 에 업로드합니다. mongoc_gridfs_bucket_upload_from_stream() 함수를 사용하면 옵션 문서 에서 구성 정보를 지정할 수 있으며, 이 정보를 매개변수로 전달할 수 있습니다.

이 예에서는 다음 조치를 수행합니다.

  • mongoc_stream_file_new_for_path() 함수를 호출하여 /path/to/input_file 에 있는 파일 을 읽기 전용(O_RDONLY) 모드 에서 스트림 으로 엽니다.

  • mongoc_gridfs_bucket_upload_from_stream() 함수를 호출하여 스트림 의 내용을 "new_file"이라는 GridFS 파일 에 업로드합니다.

  • mongoc_stream_close()mongoc_stream_destroy() 함수를 호출하여 스트림 을 닫고 삭제합니다.

mongoc_stream_t *file_stream = mongoc_stream_file_new_for_path ("/path/to/input_file", O_RDONLY, 0);
bson_error_t error;
if (!mongoc_gridfs_bucket_upload_from_stream (bucket, "new_file", file_stream, NULL, NULL, &error)) {
fprintf (stderr, "Failed to upload file: %s\n", error.message);
}
mongoc_stream_close (file_stream);
mongoc_stream_destroy (file_stream);

이 섹션에서는 GridFS 버킷의 files 컬렉션 에 저장된 파일 메타데이터 를 조회 학습 방법을 알아볼 수 있습니다. 파일의 메타데이터 에는 다음을 포함하여 파일 이 참조하는 파일에 대한 정보가 포함되어 있습니다.

  • 파일의 _id입니다.

  • 파일 이름

  • 파일의 길이/크기

  • 업로드 날짜 및 시간

  • 다른 정보를 저장할 수 있는 metadata 문서입니다.

GridFS 버킷에서 파일을 조회 하려면 mongoc_gridfs_bucket_find() 함수를 호출하고 버킷을 매개변수로 전달합니다. 이 함수는 결과에 액세스 할 수 있는 커서 를 반환합니다.

C 운전자 의 커서에 학습 보려면 커서에서 데이터 액세스 가이드 를 참조하세요.

다음 코드 예시 는 GridFS 버킷의 파일에서 파일 메타데이터 를 조회 하고 인쇄하는 방법을 보여줍니다. while 루프를 사용하여 반환된 커서 를 반복하고 파일 업로드 예제에 업로드 된 파일의 내용을 표시합니다.

mongoc_cursor_t *cursor = mongoc_gridfs_bucket_find(bucket, bson_new(), NULL);
const bson_t *file_doc;
while (mongoc_cursor_next(cursor, &file_doc)) {
char *json = bson_as_json(file_doc, NULL);
printf("%s\n", json);
bson_free(json);
}
mongoc_cursor_destroy (cursor);
{ "_id" : { "$oid" : "..." }, "length" : 13, "chunkSize" : 261120, "uploadDate" :
{ "$date" : ... }, "filename" : "my_file", "metadata" : { } }
{ "_id" : { "$oid" : "..." }, "length" : 13, "chunkSize" : 261120, "uploadDate" :
{ "$date" : ... }, "filename" : "new_file", "metadata" : { } }

함수는 mongoc_gridfs_bucket_find() 다양한 쿼리 사양을 허용합니다. 옵션 매개변수를 사용하여 정렬 순서, 반환할 최대 문서 수, 반환하기 전에 건너뛸 문서 수를 지정할 수 있습니다. 사용 가능한 옵션 목록을 보려면 mongoc_collection_find_with_opts() API 문서를 참조하세요.

다음 함수를 사용하여 GridFS 버킷에서 파일을 다운로드 할 수 있습니다.

  • mongoc_gridfs_bucket_open_download_stream(): 파일 내용을 읽을 수 있는 새 다운로드 스트림 을 엽니다.

  • mongoc_gridfs_bucket_download_to_stream(): 전체 파일 을 기존 다운로드 스트림 에 씁니다.

mongoc_gridfs_bucket_open_download_stream() 함수를 사용하여 다운로드 스트림 을 생성하여 MongoDB database 에서 파일을 다운로드 할 수 있습니다.

이 예시 에서는 다운로드 스트림 을 사용하여 다음 작업을 수행합니다.

  • mongoc_gridfs_bucket_open_download_stream() 함수를 호출하여 지정된 _id 값을 가진 GridFS 파일 을 선택하고 읽기 가능한 스트림 으로 엽니다.

  • mongoc_stream_read() 함수를 호출하여 파일 의 내용을 읽습니다.

  • mongoc_stream_close()mongoc_stream_destroy() 함수를 호출하여 파일 을 가리키는 다운로드 스트림 을 닫고 삭제합니다.

char buf[512];
bson_value_t file_id;
file_id.value_type = BSON_TYPE_OID;
bson_oid_init_from_string (&file_id.value.v_oid, "66fb1b8ea0f84a74ee099e71");
bson_error_t error;
mongoc_stream_t *download_stream = mongoc_gridfs_bucket_open_download_stream (bucket, &file_id, &error);
if (!download_stream) {
fprintf (stderr, "Failed to create download stream: %s\n", error.message);
}
mongoc_stream_read (download_stream, buf, 1, 1, 0);
mongoc_stream_close (download_stream);
mongoc_stream_destroy (download_stream);

참고

파일 이름이 같은 문서가 여러 개 있는 경우 GridFS 는 지정된 이름의 가장 최근 파일 을 스트림 합니다( uploadDate 필드 에 따라 결정됨).

mongoc_gridfs_bucket_download_to_stream() 함수를 호출하여 GridFS 파일 의 내용을 기존 스트림 에 다운로드 할 수 있습니다.

이 예에서는 다음 조치를 수행합니다.

  • mongoc_stream_file_new_for_path() 함수를 호출하여 /path/to/output_file 에 있는 파일 을 읽기 및 쓰기 (write) (O_RDWR) 모드 에서 스트림 으로 엽니다.

  • 지정된 _id 값을 가진 GridFS 파일 을 스트림 에 다운로드 합니다.

  • mongoc_stream_close()mongoc_stream_destroy() 함수를 호출하여 파일 스트림 을 닫고 삭제합니다.

mongoc_stream_t *file_stream = mongoc_stream_file_new_for_path ("/path/to/output_file", O_RDWR, 0);
bson_error_t error;
if (!file_stream) {
fprintf (stderr, "Error opening file stream: %s\n", error.message);
}
bson_value_t file_id;
file_id.value_type = BSON_TYPE_OID;
bson_oid_init_from_string (&file_id.value.v_oid, "66fb1b8ea0f84a74ee099e71");
if (!mongoc_gridfs_bucket_download_to_stream (bucket, &file_id, file_stream, &error)) {
fprintf (stderr, "Failed to download file: %s\n", error.message);
}
mongoc_stream_close (file_stream);
mongoc_stream_destroy (file_stream);

mongoc_gridfs_bucket_delete_by_id() 함수를 사용하여 버킷에서 파일의 컬렉션 문서 와 관련 청크를 제거 합니다. 이렇게 하면 파일 이 효과적으로 삭제됩니다.

다음 예시에서는 _id 필드를 참고하여 파일을 삭제하는 방법을 보여 줍니다.

bson_error_t error;
bson_oid_t oid;
bson_oid_init_from_string (&oid, "66fb1b365fd1cc348b031b01");
if (!mongoc_gridfs_bucket_delete_by_id (bucket, &oid, &error)) {
fprintf (stderr, "Failed to delete file: %s\n", error.message);
}

참고

파일 수정본

mongoc_gridfs_bucket_delete_by_id() 함수는 한 번에 하나의 파일 삭제만 지원합니다. 각 파일 수정본을 삭제 하거나 동일한 파일 이름을 주식 하는 업로드 시간이 다른 파일을 삭제하려면 각 수정본의 _id 값을 수집합니다. 그런 다음 mongoc_gridfs_bucket_delete_by_id() 함수에 대한 각 _id 값을 개별적으로 호출하여 전달합니다.

C 운전자 를 사용하여 대용량 파일을 저장 하고 조회 하는 방법에 학습 보려면 다음 API 설명서를 참조하세요.

돌아가기

트랜잭션