MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi PyMongo encode-t-il uuid.uuid1() en tant que BSON::Binary ?

La sérialisation par défaut pour un Python uuid utilise un UUID représentation binaire dans la spec BSON car cela garantit un tri cohérent pour les requêtes de plage et utilise également moins de stockage pour les données/index.

Par exemple, ces trois chaînes sont équivalentes en hexadécimal :

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

..mais ont des ordres de tri différents en tant que chaînes :

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

Comparaison des tailles 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 vous souhaitez insérer des chaînes, vous pouvez utiliser UUID.hex pour obtenir l'équivalent de la chaîne de 32 caractères :

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

Si vous voulez trouver des UUID par chaîne à partir de Python, vous pouvez utiliser le uuid. UUID méthodes :

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

Si vous souhaitez rechercher des UUID par chaîne à partir du mongo shell, il y a un UUID() aide :

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

Remarque :il existe quelques autres sous-types d'UUID disponibles pour l'interopérabilité avec d'autres versions de pilotes, comme décrit dans le Documents API pour bson.binary .