MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que o PyMongo codifica uuid.uuid1() como um BSON::Binary?


A serialização padrão para um Python uuid usa um UUID representação binária na especificação BSON porque isso garante uma classificação consistente para consultas de intervalo e também usa menos armazenamento para dados/índices.

Por exemplo, essas três strings são equivalentes em hexadecimal:
5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..mas têm ordens de classificação diferentes como strings:
> db.uuidsort.find().sort({_id:1})
{ "_id" : "5D78AD35EA5F11E1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

Comparando os tamanhos de bson:
> db.uuidtest.find()
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

> Object.bsonsize(db.uuidtest.findOne({_id: BinData(3,"XXitNepfEeGhg3BWgbKcRw==")}))
31

> Object.bsonsize(db.uuidtest.findOne({_id: "5d78ad35ea5f11e1a183705681b29c47"}))
47

Se você deseja inserir como strings, pode usar UUID.hex para obter o equivalente de string de 32 caracteres:
>>> db.uuidtest.insert({'_id': uuid.hex})
'5d78ad35ea5f11e1a183705681b29c47'

Se você quiser encontrar UUIDs por string do Python, você pode usar o uuid. UUI métodos:
>>> db.uuidtest.find_one({'_id':uuid.UUID('5d78ad35ea5f11e1a183705681b29c47')})
{u'_id': UUID('5d78ad35-ea5f-11e1-a183-705681b29c47')}

Se você deseja encontrar UUIDs por string do mongo shell, existe um UUID() ajudante:
> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')})
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }

Observação:há alguns outros subtipos de UUID disponíveis para interoperabilidade com outras versões de driver, conforme descrito no Documentos da API para bson.binary .