Почему PyMongo кодирует uuid.uuid1 () как BSON :: Binary?

Я добавляю ключ «GUID» со значением uuid.uuid1 () (из модуля python uuid) для всех моих документов в Mongo. Я заметил, что они хранятся не как строки, а как тип BSON :: Binary . Я уже сделал несколько Googling, но я до сих пор не понимаю, какова цель / преимущество этой сериализации. Может кто-нибудь объяснить? Должен ли я преобразовывать uuid.uuid1 () в строки перед сохранением? Как я могу использовать строку для find () по значению GUID, например db.myCol.find ({'GUID': aString})?

Сериализация по умолчанию для Python uuid использует двоичное представление UUID в спецификации BSON, поскольку это обеспечивает согласованную сортировку для запросов диапазона, а также использует меньше хранилища для данных / индексов.

Например, эти три строки эквивалентны в шестнадцатеричном виде:

 5d78ad35ea5f11e1a183705681b29c47 5D78AD35EA5F11E1A183705681B29C47 5d78ad35ea5f11e1A183705681B29C47 

.. но имеют разные порядки сортировки как строки:

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

Сравнение размеров 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 

Если вы хотите вставить строки, вы можете использовать UUID.hex для получения 32-символьной строки:

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

Если вы хотите найти UUID по строке из Python, вы можете использовать методы uuid.UUID :

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

Если вы хотите найти UUID по строке из оболочки mongo , есть помощник UUID() :

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

Примечание. Есть несколько других подтипов UUID, доступных для взаимодействия с другими версиями драйверов, как описано в документах API для bson.binary .