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 .