2024-05-10 09:58:35 发布
网友
我正在添加值为的“GUID”键uuid.uuid1()(来自python uuid模块)用于Mongo中的所有文档。我注意到它们不是作为字符串存储的,而是作为typeBSON::Binary存储的。我已经做了一些谷歌搜索,但我仍然不明白这个序列化的目的/好处是什么。有人能解释一下吗?我应该转换uuid.uuid1()在存储前将其转换为字符串?如何使用字符串按GUID值查找()myCol.find数据库({GUID':aString})?在
Python uuid的默认序列化在BSON spec中使用UUID二进制表示形式,因为这样可以确保范围查询的一致排序,而且数据/索引的存储也更少。在
uuid
UUID
例如,这三个字符串在十六进制中是等价的:
5d78ad35ea5f11e1a183705681b29c47 5D78AD35EA5F11E1A183705681B29C47 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')}
如果要从mongoshell中按字符串查找uuid,有一个UUID()助手:
mongo
UUID()
> db.uuidtest.find({_id:UUID('5d78ad35ea5f11e1a183705681b29c47')}) { "_id" : BinData(3,"XXitNepfEeGhg3BWgbKcRw==") }
注意:还有一些其他UUID子类型可用于与其他驱动程序版本的互操作性,如API docs for bson.binary中所述。在
Python
uuid
的默认序列化在BSON spec中使用UUID
二进制表示形式,因为这样可以确保范围查询的一致排序,而且数据/索引的存储也更少。在例如,这三个字符串在十六进制中是等价的:
…但字符串的排序顺序不同:
^{pr2}$比较bson大小:
如果确实要作为字符串插入,可以使用UUID.hex获得等效的32个字符的字符串:
如果要从Python中按字符串查找uuid,可以使用uuid.UUID方法:
如果要从
mongo
shell中按字符串查找uuid,有一个UUID()
助手:注意:还有一些其他UUID子类型可用于与其他驱动程序版本的互操作性,如API docs for bson.binary中所述。在
相关问题 更多 >
编程相关推荐