데이터베이스 및 컬렉션
개요
이 가이드에서는 PyMongo와 함께 MongoDB 데이터베이스 및 컬렉션을 사용하는 방법을 배울 수 있습니다.
MongoDB는 데이터를 다음 수준의 계층 구조로 구성합니다.
데이터베이스: MongoDB 인스턴스에서 데이터 구성의 최상위 수준입니다.
컬렉션: MongoDB는 문서를 컬렉션에 저장합니다. 관계형 데이터베이스의 테이블과 유사합니다.
문서: string, 숫자, 날짜 및 기타 내장된 문서와 같은 리터럴 데이터를 포함합니다.
문서 필드 유형 및 구조에 대한 자세한 내용은 MongoDB Server 매뉴얼의 문서 가이드를 참조하세요.
데이터베이스에 액세스
MongoClient
인스턴스에서 사전 스타일의 액세스를 사용하여 데이터베이스에 액세스합니다.
다음 예제에서는 test_database
데이터베이스에 액세스합니다.
database = client["test_database"]
컬렉션에 액세스
데이터베이스 인스턴스에서 딕셔너리 스타일의 액세스를 사용하여 컬렉션에 액세스합니다.
다음 예시 test_collection
이라는 컬렉션 에 액세스합니다.
database = client["test_database"] collection = database["test_collection"]
팁
제공된 컬렉션 이름이 데이터베이스에 아직 존재하지 않는 경우, MongoDB는 데이터를 처음 삽입할 때 컬렉션을 암시적으로 생성합니다.
컬렉션 생성
create_collection()
메서드를 사용하여 MongoDB database 에 컬렉션을 명시적으로 만듭니다.
다음 예시 example_collection
라는 컬렉션 을 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
database = client["test_database"] database.create_collection("example_collection")
database = client["test_database"] await database.create_collection("example_collection")
최대 크기 및 문서 유효성 검사 규칙과 같은 컬렉션 옵션을 키워드 인수로 전달하여 지정할 수 있습니다. 선택적 매개변수의 전체 목록은 create_collection() API 문서를 참조하세요.
Time Series 컬렉션
Time series 컬렉션은 일정 기간 동안의 측정 시퀀스를 효율적으로 저장 . 다음 예시 에서는 문서의 시간 필드 timestamp
인 example_ts_collection
time series 컬렉션 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
database = client["test_database"] database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
database = client["test_database"] await database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
PyMongo 에서 Time Series 데이터 사용하는 방법에 대한 자세한 내용은 Time Series 데이터 가이드 참조하세요.
고정 사이즈 컬렉션
지정된 메모리 크기나 문서 수를 초과하여 확장할 수 없는 고정 사이즈 컬렉션 생성할 수 있습니다. 다음 예시 최대 크기가 1000 바이트인 example_capped_collection
이라는 고정 사이즈 컬렉션 만듭니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
database = client["test_database"] database.create_collection("example_capped_collection", capped=True, size=1000)
database = client["test_database"] await database.create_collection("example_capped_collection", capped=True, size=1000)
고정 사이즈 컬렉션에 대해 자세히 학습 MongoDB Server 매뉴얼의 고정 사이즈 컬렉션을 참조하세요.
컬렉션 목록 가져오기
list_collections()
메서드를 호출하여 데이터베이스의 컬렉션 목록을 쿼리할 수 있습니다. 이 메서드는 데이터베이스의 모든 컬렉션과 관련 메타데이터가 포함된 커서를 반환합니다.
다음 예시 list_collections()
메서드를 호출하고 커서 반복하여 결과를 인쇄합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
database = client["test_database"] collection_list = database.list_collections() for c in collection_list: print(c)
database = client["test_database"] collection_list = await database.list_collections() for c in collection_list: print(c)
데이터베이스에서 컬렉션 이름만 쿼리하려면 다음과 같이 list_collection_name()
메서드를 호출합니다.
collection_list = database.list_collection_names() for c in collection_list: print(c)
collection_list = await database.list_collection_names() async for c in collection_list: print(c)
커서 반복에 대한 자세한 내용은 커서에서 데이터 액세스 항목을 참조하세요.
컬렉션 삭제
drop_collection()
메서드를 사용하여 데이터베이스에서 컬렉션을 삭제할 수 있습니다.
다음 예시 test_collection
컬렉션 삭제합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
collection = database["test_collection"] collection.drop()
collection = database["test_collection"] await collection.drop()
경고
컬렉션을 제거하면 컬렉션의 모든 데이터가 삭제됨
데이터베이스에서 컬렉션을 삭제하면 해당 컬렉션 내의 모든 문서와 모든 인덱스가 영구적으로 삭제됩니다.
컬렉션의 데이터가 더 이상 필요하지 않은 경우에만 컬렉션을 삭제하세요.
유형 힌트
애플리케이션 에서 Python 이상을 사용하는 경우 3.5 PEP 에 484 설명된 대로 코드에 유형 힌트 를 추가할 수 있습니다. 유형 힌트는 변수, 매개변수, 함수 반환 값의 데이터 유형과 문서 구조를 나타냅니다. 일부 IDE는 유형 힌트를 사용하여 코드에 유형 오류가 있는지 확인하고 코드 완성을 위한 적절한 옵션을 제안할 수 있습니다.
참고
Python 3.7 및 이전 버전의 TypedDict
Database
데이터베이스 의 모든 문서가 잘 정의된 스키마 와 일치하는 경우 Python 클래스를 사용하여 문서 구조를 나타내는 유형 힌트를 지정할 수 있습니다. 이 클래스를 Database
객체 의 유형 힌트에 포함하면 저장 하거나 조회 모든 문서에 필요한 구조가 있는지 확인할 수 있습니다. 이렇게 하면 기본값 Dict[str, Any]
유형보다 더 정확한 유형 검사 및 코드 완성 기능이 제공됩니다.
먼저 데이터베이스 의 문서 나타내는 클래스를 정의합니다. 클래스는 TypedDict
클래스에서 상속되어야 하며 데이터베이스 의 문서와 동일한 필드를 포함해야 합니다. 클래스를 정의한 후 클래스 이름을 Database
유형 힌트의 일반 유형으로 포함합니다.
다음 예시 Movie
클래스를 정의하고 이를 Database
유형 힌트의 일반 유형으로 사용합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
from typing import TypedDict from pymongo import MongoClient from pymongo.database import Database class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database: Database[Movie] = client["test_database"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.asynchronous.database import Database class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database: Database[Movie] = client["test_database"]
컬렉션
Collection
유형 힌트에 일반 유형을 추가하는 것은 Database
유형 힌트에 일반 유형을 추가하는 것과 유사합니다. 먼저 TypedDict
클래스에서 상속되고 컬렉션 의 문서 구조를 나타내는 클래스를 정의합니다. 그런 다음 다음 예시 와 같이 클래스 이름을 Collection
유형 힌트의 일반 유형으로 포함합니다. Synchronous 또는 Asynchronous 탭 선택하여 해당 코드를 확인합니다.
from typing import TypedDict from pymongo import MongoClient from pymongo.asynchronous.collection import Collection class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.collection import Collection class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
문제 해결
클라이언트 유형 주석
MongoClient
객체 에 대한 유형 주석을 추가하지 않으면 유형 검사기에 다음과 유사한 오류가 표시될 수 있습니다.
from pymongo import MongoClient client = MongoClient() # error: Need type annotation for "client"
해결책은 MongoClient
객체 에 client: MongoClient
또는 client: MongoClient[Dict[str, Any]]
로 주석을 추가하는 것입니다.
호환되지 않는 유형
유형 힌트로 MongoClient
를 지정했지만 문서, 키 및 값에 대한 데이터 유형을 포함하지 않는 경우 유형 검사기에 다음과 유사한 오류가 표시될 수 있습니다.
error: Dict entry 0 has incompatible type "str": "int"; expected "Mapping[str, Any]": "int"
해결 방법은 MongoClient
객체 에 다음 유형 힌트를 추가하는 것입니다.
``client: MongoClient[Dict[str, Any]]``
AutoReconnect
오류
읽기 설정에 tag-sets
을(를) 지정하고 MongoDB가 지정된 태그를 가진 복제본 세트 멤버를 찾을 수 없는 경우 이 오류가 발생합니다. 이 오류를 방지하려면 태그 세트 목록 끝에 빈 사전({}
)을 포함하세요. 이는 일치하는 태그를 찾을 수 없는 경우 읽기 참조 모드와 일치하는 모든 멤버에서 읽도록 PyMongo에 지시합니다.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.