대용량 파일 저장
이 페이지의 내용
개요
이 가이드 에서는 GridFS 를 사용하여 MongoDB 에 대용량 파일을 저장 하고 조회 하는 방법을 학습 수 있습니다. GridFS 는 C 운전자 에 의해 구현된 사양으로, 파일을 저장할 때 청크로 분할 하고 검색할 때 다시 조립하는 방법을 설명합니다. 드라이버의 GridFS 구현 은 파일 저장 의 운영 및 조직 을 관리하는 추상화입니다.
파일 크기가 BSON 문서 크기 제한인 16MB를 초과하는 경우 GridFS 를 사용하세요. GridFS 가 사용 사례 에 적합한지 여부에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 를 참조하세요.
GridFS 작동 방식
GridFS는 파일 청크와 파일을 설명하는 정보가 들어 있는 MongoDB 컬렉션 그룹인 버킷에 파일을 구성합니다. 버킷에는 GridFS 사양에 정의된 규칙을 사용하여 명명된 다음 컬렉션이 포함되어 있습니다.
chunks
컬렉션은 바이너리 파일 청크를 저장합니다.files
0} 컬렉션에 파일 메타데이터가 저장됩니다.
운전자 는 첫 번째 쓰기 (write) 작업을 수행할 때 GridFS 버킷을 생성합니다(존재하지 않는 경우). 버킷에는 다른 이름을 지정하지 않는 한 기본값 버킷 이름 fs
접두사가 붙은 앞의 collection이 포함되어 있습니다. 파일 및 관련 메타데이터 를 효율적으로 검색하기 위해 운전자 는 컬렉션이 존재하지 않거나 버킷이 비어 있는 경우 각 컬렉션 에 인덱스 도 생성합니다.
GridFS 인덱스에 대한 자세한 내용은 MongoDB Server 매뉴얼에서 GridFS 인덱스를 참조하세요.
GridFS 를 사용하여 파일을 저장 때 운전자 는 파일을 작은 청크로 분할하며, 각 청크는 chunks
컬렉션 에서 별도의 문서 로 표시됩니다. 또한 files
컬렉션 에 파일 ID, 파일 이름 및 기타 파일 메타데이터 가 포함된 문서 를 만듭니다. C 운전자 에 스트림 을 전달하여 소비하거나 새 스트림 을 생성하고 직접 작성하여 파일 을 업로드할 수 있습니다.
다음 다이어그램은 파일이 버킷에 업로드될 때 GridFS 가 파일을 분할하는 방법을 보여줍니다.
GridFS 에서 파일을 조회 할 때 지정된 버킷의 files
컬렉션 에서 메타데이터 를 가져오고 이 정보를 사용하여 chunks
컬렉션 의 문서에서 파일 을 재구성합니다. 파일 내용을 기존 스트림 에 쓰거나 파일 을 가리키는 새 스트림 을 만들어 파일 을 읽을 수 있습니다.
GridFS 버킷 만들기
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 버킷 구성을 사용자 지정할 수 있습니다. 다음 표에서는 문서 에서 설정하다 수 있는 옵션에 대해 설명합니다.
옵션 | 설명 |
---|---|
| Specifies the bucket name to use as a prefix for the files and chunks collections.
The default value is "fs" .Type: string |
| Specifies the chunk size that GridFS splits files into. The default value is 255 kB. Type: int32 |
| Specifies the read concern to use for bucket operations. The default value is the
database's read concern. Type: mongoc_read_concern_t |
| 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
값을 개별적으로 호출하여 전달합니다.
API 문서
C 운전자 를 사용하여 대용량 파일을 저장 하고 조회 하는 방법에 학습 보려면 다음 API 설명서를 참조하세요.