【发布时间】:2022-01-11 15:27:45
【问题描述】:
只是为了检查它是否可能以及是否值得麻烦:
我正在使用 python 3.9.5,mongoengine 作为 ORM。
可以说,我有数据要保存在一个集合中:
{
"value": string,
"origin: string,
"parent": string,
....
}
当字段“value”和“origin”一起唯一时。
现在,我希望能够控制 _id 字段的创建,即从这两个值生成 ObjectId 的值 - 它仍然是唯一值,不会降低性能,而且- 该值不会是随机生成的值。
对此有什么想法吗?有什么想法吗?
更新: 如果我想继续为 _id 字段使用 objectId 怎么办?
对于 objectId,只有 12/24 长的字符串是有效的。 所以我从here 中获得了一个想法,并编写了这段代码(创建了一个 24 字符长的哈希):
import hashlib
from bson.objectid import ObjectId
the_string = "..............."
24_long_str = hex(int(hashlib.sha256(the_string.encode('utf-8')).hexdigest(), 16) % (10**28))[2:]
oid = ObjectId(24_long_str)
对这段代码有什么想法吗?性能问题?该值将是唯一的以用作 id 吗?
【问题讨论】:
-
您能解释一下为什么您要从 2 个已知字段中创建一个
ObjectId吗?你认为你会享受什么好处? -
主要是为了向后兼容......使用我的代码创建的数据的人,期望将 id 作为 ObjectId。但我想控制 OID 的值,因为有时我在保存数据之前可能会遇到重复问题(多个工作人员处理同一个输入文档,或者更确切地说是由相同值 + 来源创建的同一个文档)
-
另一个选项可以是 - 是否可以在 DBRef (ReferenceField) 中使用除 id 之外的其他字段
-
我不知道在保存之前使用默认内部算法会得到重复的
ObjectId的情况,无论工人数量如何。 -
当然我的意思不是重复的objectid,而是重复的文档,由两个不同的工作人员创建,然后保存到db(python运行时内存上的文档)
标签: python-3.x mongodb hash mongoengine objectid