Python uuid 的默认序列化在 BSON spec 中使用 UUID 二进制表示,因为这样可以确保范围查询的排序一致,并且还使用更少的数据/索引存储。
例如,这三个字符串在十六进制中是等价的:
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'
如果您想从 Python 中按字符串查找 UUID,可以使用 uuid.UUID 方法:
>>> db.uuidtest.find_one({'_id':uuid.UUID('5d78ad35ea5f11e1a183705681b29c47')})
{u'_id': UUID('5d78ad35-ea5f-11e1-a183-705681b29c47')}
如果您想从mongo shell 中按字符串查找 UUID,则有一个 UUID() 助手:
> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')})
{ "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }
注意:还有一些其他 UUID 子类型可用于与其他驱动程序版本的互操作性,如 API docs for bson.binary 中所述。