IDs universalmente únicos (UUIDs)
Nesta página
- Visão geral
- Uma breve história dos UUIDs do MongoDB
- Especifique uma representação do UUID
- Representações de UUID suportadas
UNSPECIFIED
STANDARD
PYTHON_LEGACY
JAVA_LEGACY
CSHARP_LEGACY
- Solução de problemas
- ValueError: não é possível codificar uuid.UUID nativo com UuidRepresentation.UNSPECIFIED
- Documentação da API
Visão geral
Os drivers do MongoDB têm historicamente diferido na forma como codificam identificadores universalmente únicos (UUIDs). Neste guia, você pode aprender a usar a opção de configuração UuidRepresentation
do PyMongo para manter a compatibilidade entre linguagens ao trabalhar com UUIDs.
Dica
Em aplicativos MongoDB, você pode usar o tipo ObjectId
como um identificador exclusivo para um documento. Considere usar ObjectId
no lugar de um UUID sempre que possível.
Uma breve história dos UUIDs do MongoDB
Considere um UUID com a seguinte representação textual canônica:
00112233-4455-6677-8899-aabbccddeeff
Originalmente, o MongoDB representava UUIDs como valores BSON Binary
do subtipo 3. Como o subtipo 3 não padronizou a ordem de bytes dos UUIDs durante a codificação, diferentes drivers do MongoDB codificaram UUIDs com diferentes ordens de bytes. Use as guias a seguir para comparar as maneiras como diferentes drivers da linguagem MongoDB codificaram o UUID anterior para Binary
subtipo 3:
00112233-4455-6677-8899-aabbccddeeff
33221100-5544-7766-8899-aabbccddeeff
77665544-3322-1100-ffee-ddccbbaa9988
Para padronizar a ordem de bytes UUID, criamos Binary
subtipo 4. Embora esse subtipo seja tratado de forma consistente em drivers do MongoDB, alguns sistemas do MongoDB ainda contêm valores UUID de subtipo 3.
Importante
Tenha cuidado ao armazenar ou recuperar UUIDs do subtipo 3. Um UUID desse tipo armazenado por um driver do MongoDB pode ter um valor diferente quando recuperado por um driver diferente.
Especifique uma representação do UUID
Para garantir que seu aplicativo PyMongo lide com os UUIDs corretamente, use a opção UuidRepresentation
. Esta opção determina como o driver codifica objetos UUID para BSON e decodifica Binary
valores subtipo 3 e 4 de BSON.
Você pode definir a opção de representação do UUID das seguintes maneiras:
Passe o parâmetro
uuidRepresentation
ao construir umMongoClient
. O PyMongo usa a representação UUID especificada para todas as operações executadas com esta instância doMongoClient
.Inclua o parâmetro
uuidRepresentation
na connection string do MongoDB. O PyMongo usa a representação UUID especificada para todas as operações realizadas com esta instância doMongoClient
.Passe o parâmetro
codec_options
ao chamar o métodoget_database()
. O PyMongo usa a representação UUID especificada para todas as operações realizadas no banco de dados recuperado.Passe o parâmetro
codec_options
ao chamar o métodoget_collection()
. O PyMongo usa a representação UUID especificada para todas as operações realizadas na collection recuperada.
Selecione a partir das seguintes guias para ver como especificar as opções anteriores. Para saber mais sobre as representações de UUID disponíveis, consulte Representações de UUID suportadas.
O uuidRepresentation
parâmetro aceita os valores definidos no enumeração UuidRepresentation. O seguinte exemplo de código especifica STANDARD
para a representação do UUID:
from bson.binary import UuidRepresentation client = pymongo.MongoClient("mongodb://<hostname>:<port>", uuidRepresentation=UuidRepresentation.STANDARD)
O parâmetro uuidRepresentation
aceita os seguintes valores:
unspecified
standard
pythonLegacy
javaLegacy
csharpLegacy
O seguinte exemplo de código especifica standard
para a representação UUID:
uri = "mongodb://<hostname>:<port>/?uuidRepresentation=standard" client = MongoClient(uri)
Para especificar o formato UUID ao chamar o método get_database()
, crie uma instância da classe CodecOptions
e passe o argumento uuid_representation
para o construtor. O exemplo a seguir mostra como obter uma referência do banco de dados de dados utilizando o formato CSHARP_LEGACY
UUID:
from bson.codec_options import CodecOptions csharp_opts = CodecOptions(uuid_representation=UuidRepresentation.CSHARP_LEGACY) csharp_database = client.get_database("database_name", codec_options=csharp_opts)
Dica
Você também pode especificar o argumento codec_options
ao chamar o método database.with_options()
. Para obter mais informações sobre esse método, consulte Configurar operações de leitura e gravação no guia Bancos de dados e coleções.
Para especificar o formato UUID ao chamar o método get_collection()
, crie uma instância da classe CodecOptions
e passe o argumento uuid_representation
para o construtor. O exemplo a seguir mostra como obter uma referência de coleção usando o formato CSHARP_LEGACY
UUID:
from bson.codec_options import CodecOptions csharp_opts = CodecOptions(uuid_representation=UuidRepresentation.CSHARP_LEGACY) csharp_collection = client.testdb.get_collection("collection_name", codec_options=csharp_opts)
Dica
Você também pode especificar o argumento codec_options
ao chamar o método collection.with_options()
. Para obter mais informações sobre esse método, consulte Configurar operações de leitura e gravação no guia Bancos de dados e coleções.
Representações de UUID suportadas
A tabela a seguir resume as representações de UUID compatíveis com o PyMongo:
uuidRepresentação | Codificar UUID para | Decodificar Binary subtipo 4 para | Decodificar Binary subtipo 3 para |
---|---|---|---|
UNSPECIFIED (padrão) | Aumentar ValueError | Binary subtipo 4 | Binary subtipo 3 |
Binary subtipo 4 | UUID | Binary subtipo 3 | |
Binary subtipo 3 com ordem de byte padrão | Binary subtipo 4 | UUID | |
Binary subtipo 3 com ordem de byte legada Java | Binary subtipo 4 | UUID | |
Binary subtipo 3 com ordem de bytes legada de C# | Binary subtipo 4 | UUID |
As seções a seguir descrevem as opções de representação do UUID anteriores em mais detalhes.
UNSPECIFIED
Observação
UNSPECIFIED
é a representação UUID padrão no PyMongo.
Ao utilizar a representação UNSPECIFIED
, o PyMongo decodifica valores BSON Binary
para objetos Binary
do mesmo subtipo. Para converter um objeto Binary
em um objeto UUID
nativo, chame o método Binary.as_uuid()
e especifique um formato de representação UUID.
Se você tentar codificar um objeto UUID
ao usar essa representação, o PyMongo gerará um ValueError
. Para evitar isso, chame o método Binary.from_uuid()
no UUID, conforme mostrado no exemplo a seguir:
explicit_binary = Binary.from_uuid(uuid4(), UuidRepresentation.STANDARD)
O exemplo de código a seguir mostra como recuperar um documento contendo um UUID com a representação UNSPECIFIED
e, em seguida, converter o valor em um objeto UUID
. Para fazer isso, o código executa as seguintes etapas:
Insere um documento que contém um campo
uuid
usando a representaçãoCSHARP_LEGACY
UUID.Recupera o mesmo documento usando a representação
UNSPECIFIED
. O PyMongo decodifica o valor do campouuid
como um objetoBinary
.Chama o método
as_uuid()
para converter o valor do campouuid
para um objetoUUID
do tipoCSHARP_LEGACY
. Após ser convertido, este valor é idêntico ao UUID original inserido pelo PyMongo.
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
Ao usar a representação STANDARD
UUID, o PyMongo codifica objetos UUID
nativos para objetos Binary
do subtipo 4 . Todos os drivers do MongoDB que usam a representação STANDARD
tratam esses objetos da mesma maneira, sem alterações na ordem dos bytes.
Use a representação de UUID do STANDARD
em todos os novos aplicativos e em todos os aplicativos que trabalham com UUIDs MongoDB pela primeira vez.
PYTHON_LEGACY
A representação PYTHON_LEGACY
de UUID corresponde à representação legada de UUIDs usados por versões do PyMongo anteriores à v4.0. Ao usar a PYTHON_LEGACY
representação UUID, o PyMongo codifica UUID
objetos nativos para Binary
3 objetos do subtipo, preservando a mesma ordem de bytes da UUID.bytes
propriedade .
Use a representação PYTHON_LEGACY
UUID se o UUID que você está lendo do MongoDB foi inserido usando a representação PYTHON_LEGACY
. Isso será verdade se ambos os critérios a seguir forem atendidos:
O UUID foi inserido por um aplicativo usando uma versão do PyMongo anterior à v4.0.
O aplicativo que inseriu o UUID não especificou a representação do UUID do
STANDARD
.
JAVA_LEGACY
A representação JAVA_LEGACY
UUID corresponde à representação legada de UUIDs usada pelo MongoDB Java Driver. Ao usar a representação JAVA_LEGACY
UUID, o PyMongo codifica objetos UUID
Binary
do subtipo 3 com ordem de bytes legada Java.
Use a representação JAVA_LEGACY
UUID se o UUID que você está lendo do MongoDB foi inserido usando a representação JAVA_LEGACY
. Isso será verdade se ambos os critérios a seguir forem atendidos:
O UUID foi inserido por um aplicativo usando o driver Java do MongoDB.
O aplicativo não especificou a representação do UUID do
STANDARD
.
CSHARP_LEGACY
A representação CSHARP_LEGACY
UUID corresponde à representação legada de UUIDs usada pelo Driver MongoDB .NET/C#. Ao usar a representação CSHARP_LEGACY
UUID, o PyMongo codifica objetos UUID
Binary
do subtipo 3 com a ordem de bytes legada de C#.
Use a representação CSHARP_LEGACY
UUID se o UUID que você está lendo do MongoDB foi inserido usando a representação CSHARP_LEGACY
. Isso será verdade se ambos os critérios a seguir forem atendidos:
O UUID foi inserido por um aplicativo usando o driver MongoDB .NET/C#.
O aplicativo não especificou a representação do UUID do
STANDARD
.
Solução de problemas
ValueError: não é possível codificar uuid.UUID nativo com UuidRepresentation.UNSPECIFIED
Esse erro resulta da tentativa de codificar um objeto UUID
nativo para um objeto Binary
quando a representação do UUID é UNSPECIFIED
, conforme mostrado no exemplo de código a seguir:
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.
Em vez disso, você deve converter explicitamente um UUID nativo em um objeto Binary
usando o método Binary.from_uuid()
, conforme mostrado no exemplo a seguir:
explicit_binary = Binary.from_uuid(uuid4(), UuidRepresentation.STANDARD) unspec_collection.insert_one({'_id': 'bar', 'uuid': explicit_binary})
Documentação da API
Para saber mais sobre UUIDs e PyMongo, consulte a seguinte documentação da API: