Docs Menu

Docs Home애플리케이션 개발Python 드라이버PyMongo

범용 고유 ID(UUID)

이 페이지의 내용

  • 개요
  • MongoDB UUID의 짧은 역사
  • UUID 표현 지정
  • 지원되는 UUID 표현
  • UNSPECIFIED
  • STANDARD
  • PYTHON_LEGACY
  • JAVA_LEGACY
  • CSHARP_LEGACY
  • 문제 해결
  • ValueError: 네이티브 uuid.UUID를 UuidRepresentation.UNSPECIFIED로 인코딩할 수 없습니다.
  • API 문서

MongoDB 드라이버는 역사적으로 UUID( Universally Unique Identifier )를 인코딩하는 방식이 다릅니다. 이 가이드에서는 PyMongo의 UuidRepresentation 구성 옵션을 사용하여 UUID로 작업할 때 언어 간 호환성을 유지하는 방법을 배울 수 있습니다.

MongoDB 애플리케이션에서는 ObjectId 유형을 문서의 고유 식별자로 사용할 수 있습니다. 가능하면 UUID 대신 ObjectId 를 사용하는 것이 좋습니다.

다음과 같은 표준 텍스트 표현을 가진 UUID를 가정해 보겠습니다.

00112233-4455-6677-8899-aabbccddeeff

원래 MongoDB는 UUID를 3 하위 유형의 BSON Binary 값으로 표시했습니다. 하위 유형 3 가 인코딩 중에 UUID의 바이트 순서를 표준화하지 않았기 때문에 서로 다른 MongoDB 드라이버가 서로 다른 바이트 순서로 UUID를 인코딩했습니다. 다음 탭을 사용하여 다양한 MongoDB 언어 드라이버가 앞의 UUID를 Binary 하위 유형 3 로 인코딩한 방식을 비교합니다.

UUID 바이트 순서를 표준화하기 위해 Binary 하위 유형 4 을 만들었습니다. 이 하위 유형은 MongoDB 드라이버 전체에서 일관되게 처리되지만, 일부 MongoDB 배포에는 여전히 하위 유형 3 의 UUID 값이 포함되어 있습니다.

중요

하위 유형 3 의 UUID를 저장하거나 검색할 때는 주의해야 합니다. 한 MongoDB 드라이버에 의해 저장된 이 유형의 UUID는 다른 드라이버에서 검색할 때 다른 값을 가질 수 있습니다.

PyMongo 애플리케이션이 UUID를 올바르게 처리하는지 확인하려면 UuidRepresentation 옵션을 사용합니다. 이 옵션은 드라이버가 UUID 객체를 BSON으로 인코딩하고 BSON에서 Binary 하위 유형 3 및 4 값을 디코딩하는 방법을 결정합니다.

다음과 같은 방법으로 UUID 표시 옵션을 설정할 수 있습니다.

  • MongoClient 구성 시 uuidRepresentation 매개변수를 전달합니다. PyMongo는 이 MongoClient 인스턴스로 수행되는 모든 작업에 지정된 UUID 표현을 사용합니다.

  • MongoDB 연결 string 에 uuidRepresentation 매개 변수를 포함합니다. PyMongo는 이 MongoClient 인스턴스로 수행되는 모든 작업에 지정된 UUID 표현을 사용합니다.

  • get_database() 메서드를 호출할 때 codec_options 매개변수를 전달합니다. PyMongo는 조회된 데이터베이스에서 수행되는 모든 작업에 지정된 UUID 표현을 사용합니다.

  • get_collection() 메서드를 호출할 때 codec_options 매개변수를 전달합니다. PyMongo는 조회된 컬렉션에서 수행되는 모든 작업에 지정된 UUID 표현을 사용합니다.

다음 탭에서 선택하여 이전 옵션을 지정하는 방법을 확인합니다. 사용 가능한 UUID 표현에 대해 자세히 알아보려면 지원되는 UUID 표현을 참조하세요.

다음 표에는 PyMongo가 지원하는 UUID 표현이 요약되어 있습니다.

uuidRepresentation
UUID 을(를) 다음으로 인코딩
Binary 하위 유형 4 을(를) 다음으로 디코딩
Binary 하위 유형 3 을(를) 다음으로 디코딩
UNSPECIFIED (기본값)
올리기 ValueError
Binary 하위 유형 4
Binary 하위 유형 3
Binary 하위 유형 4
UUID
Binary 하위 유형 3
Binary 표준 바이트 순서의 하위 유형 3
Binary 하위 유형 4
UUID
Binary Java 레거시 바이트 순서가 있는 하위 유형 3
Binary 하위 유형 4
UUID
Binary C# 레거시 바이트 순서가 있는 하위 유형 3
Binary 하위 유형 4
UUID

다음 섹션에서는 앞의 UUID 표현 옵션에 대해 자세히 설명합니다.

참고

UNSPECIFIED PyMongo의 기본 UUID 표현입니다.

UNSPECIFIED 표현을 사용할 때 PyMongo는 BSON Binary 값을 동일한 하위 유형의 Binary 객체로 디코딩합니다. Binary 객체를 네이티브 UUID 객체로 변환하려면 Binary.as_uuid() 메서드를 호출하고 UUID 표현 형식을 지정합니다.

이 표현을 사용하는 동안 UUID 객체를 인코딩하려고 하면 PyMongo가 ValueError 을 발생시킵니다. 이를 방지하려면 다음 예제와 같이 UUID에서 Binary.from_uuid() 메서드를 호출합니다.

explicit_binary = Binary.from_uuid(uuid4(), UuidRepresentation.STANDARD)

다음 코드 예시에서는 UNSPECIFIED 표현으로 UUID가 포함된 문서를 조회한 다음 값을 UUID 객체로 변환하는 방법을 보여 줍니다. 이를 위해 코드는 다음 단계를 수행합니다.

  • CSHARP_LEGACY UUID 표현을 사용하여 uuid 필드가 포함된 문서를 삽입합니다.

  • UNSPECIFIED 표현을 사용하여 동일한 문서를 조회합니다. PyMongo는 uuid 필드의 값을 Binary 객체로 디코딩합니다.

  • as_uuid() 메서드를 호출하여 uuid 필드의 값을 CSHARP_LEGACY 유형의 UUID 객체로 변환합니다. 변환된 후 이 값은 PyMongo에서 삽입한 원래 UUID와 동일합니다.

from bson.codec_options import CodecOptions, DEFAULT_CODEC_OPTIONS
from bson.binary import Binary, UuidRepresentation
from uuid import uuid4
# Using UuidRepresentation.CSHARP_LEGACY
csharp_opts = CodecOptions(uuid_representation=UuidRepresentation.CSHARP_LEGACY)
# Store a legacy C#-formatted UUID
input_uuid = uuid4()
collection = client.testdb.get_collection('test', codec_options=csharp_opts)
collection.insert_one({'_id': 'foo', 'uuid': input_uuid})
# Using UuidRepresentation.UNSPECIFIED
unspec_opts = CodecOptions(uuid_representation=UuidRepresentation.UNSPECIFIED)
unspec_collection = client.testdb.get_collection('test', codec_options=unspec_opts)
# UUID fields are decoded as Binary when UuidRepresentation.UNSPECIFIED is configured
document = unspec_collection.find_one({'_id': 'foo'})
decoded_field = document['uuid']
assert isinstance(decoded_field, Binary)
# Binary.as_uuid() can be used to convert the decoded value to a native UUID
decoded_uuid = decoded_field.as_uuid(UuidRepresentation.CSHARP_LEGACY)
assert decoded_uuid == input_uuid

STANDARD UUID 표현을 사용할 때 PyMongo는 네이티브 UUID 객체를 Binary 하위 유형 4 객체로 인코딩합니다. STANDARD 표현을 사용하는 모든 MongoDB 드라이버는 바이트 순서를 변경하지 않고 이러한 객체를 동일한 방식으로 처리합니다.

모든 새 애플리케이션과 MongoDB UUID로 처음 작업하는 모든 애플리케이션에서 STANDARD UUID 표현을 사용합니다.

PYTHON_LEGACY UUID 표현은 v4.0 이전 PyMongo 버전에서 사용된 UUID의 레거시 표현에 해당합니다. PYTHON_LEGACY UUID 표현을 사용할 때 PyMongo는 UUID.bytes 속성과 동일한 바이트 순서를 유지하면서 네이티브 UUID 객체를 Binary 하위 유형 3 객체로 인코딩합니다.

MongoDB에서 읽는 UUID가 PYTHON_LEGACY 표현을 사용하여 삽입된 경우 PYTHON_LEGACY UUID 표현을 사용합니다. 이는 다음 기준이 두 가지 모두 충족되는 경우에 해당됩니다.

  • UUID가 v4.0 이전 버전의 PyMongo를 사용하는 애플리케이션에 의해 삽입되었습니다.

  • UUID를 삽입한 애플리케이션이 STANDARD UUID 표현을 지정하지 않았습니다.

JAVA_LEGACY UUID 표현은 MongoDB Java 드라이버에서 사용하는 UUID의 레거시 표현에 해당합니다. JAVA_LEGACY UUID 표현을 사용할 때 PyMongo는 네이티브 UUID 객체를 Java 레거시 바이트 순서로 Binary 하위 유형 3 객체로 인코딩합니다.

MongoDB에서 읽는 UUID가 JAVA_LEGACY 표현을 사용하여 삽입된 경우 JAVA_LEGACY UUID 표현을 사용합니다. 이는 다음 기준이 두 가지 모두 충족되는 경우에 해당됩니다.

  • UUID는 MongoDB Java 드라이버를 사용하는 애플리케이션에 의해 삽입되었습니다.

  • 애플리케이션이 STANDARD UUID 표현을 지정하지 않았습니다.

CSHARP_LEGACY UUID 표현은 MongoDB .NET/C# 드라이버에서 사용하는 UUID의 레거시 표현에 해당합니다. CSHARP_LEGACY UUID 표현을 사용할 때 PyMongo는 네이티브 UUID 객체를 C# 레거시 바이트 순서로 Binary 하위 유형 3 객체로 인코딩합니다.

MongoDB에서 읽는 UUID가 CSHARP_LEGACY 표현을 사용하여 삽입된 경우 CSHARP_LEGACY UUID 표현을 사용합니다. 이는 다음 기준이 두 가지 모두 충족되는 경우에 해당됩니다.

  • UUID는 MongoDB .NET/C# 드라이버를 사용하는 애플리케이션에서 삽입되었습니다.

  • 애플리케이션이 STANDARD UUID 표현을 지정하지 않았습니다.

이 오류는 다음 코드 예시와 같이 UUID 표현이 UNSPECIFIED 일 때 네이티브 UUID 객체를 Binary 객체로 인코딩하려고 시도할 때 발생합니다.

unspecified_collection.insert_one({'_id': 'bar', 'uuid': uuid4()})
Traceback (most recent call last):
...
ValueError: cannot encode native uuid.UUID with UuidRepresentation.UNSPECIFIED.
UUIDs can be manually converted to bson.Binary instances using bson.Binary.from_uuid()
or a different UuidRepresentation can be configured. See the documentation for
UuidRepresentation for more information.

대신 다음 예와 같이 Binary.from_uuid() 메서드를 사용하여 네이티브 UUID를 Binary 객체로 명시적으로 변환해야 합니다.

explicit_binary = Binary.from_uuid(uuid4(), UuidRepresentation.STANDARD)
unspec_collection.insert_one({'_id': 'bar', 'uuid': explicit_binary})

UUID 및 PyMongo에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

← 날짜 및 시간