为什么PyMongo编码uuid.uuid1()作为BSON::Binary?

2024-05-10 09:58:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在添加值为的“GUID”键uuid.uuid1()(来自python uuid模块)用于Mongo中的所有文档。我注意到它们不是作为字符串存储的,而是作为typeBSON::Binary存储的。我已经做了一些谷歌搜索,但我仍然不明白这个序列化的目的/好处是什么。有人能解释一下吗?我应该转换uuid.uuid1()在存储前将其转换为字符串?如何使用字符串按GUID值查找()myCol.find数据库({GUID':aString})?在


Tags: 模块字符串文档目的数据库序列化uuidmongo
1条回答
网友
1楼 · 发布于 2024-05-10 09:58:35

Python uuid的默认序列化在BSON spec中使用UUID二进制表示形式,因为这样可以确保范围查询的一致排序,而且数据/索引的存储也更少。在

例如,这三个字符串在十六进制中是等价的:

5d78ad35ea5f11e1a183705681b29c47
5D78AD35EA5F11E1A183705681B29C47
5d78ad35ea5f11e1A183705681B29C47

…但字符串的排序顺序不同:

^{pr2}$

比较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')}

如果要从mongoshell中按字符串查找uuid,有一个UUID()助手:

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

注意:还有一些其他UUID子类型可用于与其他驱动程序版本的互操作性,如API docs for bson.binary中所述。在

相关问题 更多 >