sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué PyMongo codifica uuid.uuid1() como BSON::Binary?

La serialización predeterminada para Python uuid usa un UUID representación binaria en BSON spec porque esto asegura una clasificación consistente para consultas de rango y también usa menos almacenamiento para datos/índices.

Por ejemplo, estas tres cadenas son equivalentes en hexadecimal:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..pero tienen diferentes órdenes de clasificación como cadenas:

> db.uuidsort.find().sort({_id:1})
{ "_id" : "5D78AD35EA5F11E1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1A183705681B29C47" }
{ "_id" : "5d78ad35ea5f11e1a183705681b29c47" }

Comparando los tamaños 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

Si desea insertar como cadenas, puede usar UUID.hex para obtener el equivalente de cadena de 32 caracteres:

>>> db.uuidtest.insert({'_id': uuid.hex})
'5d78ad35ea5f11e1a183705681b29c47'

Si desea encontrar UUID por cadena de Python, puede usar uuid. UUID métodos:

>>> db.uuidtest.find_one({'_id':uuid.UUID('5d78ad35ea5f11e1a183705681b29c47')})
{u'_id': UUID('5d78ad35-ea5f-11e1-a183-705681b29c47')}

Si desea encontrar UUID por cadena desde mongo shell, hay un UUID() ayudante:

> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')})
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }

Nota:hay algunos otros subtipos de UUID disponibles para la interoperabilidad con otras versiones del controlador, como se describe en Documentos API para bson.binary .