在MongoDB中创建自定义对象ID

kcrjzv8t  于 2023-02-03  发布在  Go
关注(0)|答案(4)|浏览(305)

我正在创建一个服务,我将使用MongoDB作为存储后端,这个服务将产生用户输入的散列,然后查看相同的散列(+ input)是否已经存在于我们的数据集中。
哈希值将是唯一的,但随机的(=非增量/顺序),所以我的问题是:
1.使用随机值作为对象ID是否合法?例如:
$object_id = new MongoId(HEX-OF-96BIT-HASH);
或者,MongoDB是否会将ObjectID与其他服务器生成的ObjectID区别对待,因为“真实的的”ObjectID还包含时间戳、machine_id等?
使用'random'值的优点和缺点是什么?我猜当new _id不是增量的时候,引擎在插入时更新索引在统计上会更慢-我说的对吗?

kgqe7b3p

kgqe7b3p1#

是的,使用随机值作为对象ID是非常好的,如果某个值出现在正在存储的文档的_id字段中,则将其视为对象ID。
由于_id字段总是被索引和主键,您需要确保为每个对象生成不同的objectid。优化用户定义的对象id有一些准则:
https://docs.mongodb.com/manual/core/document/#the-id-field.

anhgbhbe

anhgbhbe2#

虽然_id字段可以使用任何值,包括散列,但我建议不要使用随机值,原因有二:
1.在为两个不同的对象生成相同的随机值的情况下,您可能需要开发一个冲突管理策略。您暗示您将使用某种类型的散列算法生成ID。我不会认为这些值是“随机”的,因为它们是基于您使用散列消化的内容。冲突的概率是内容多样性和哈希算法的函数,如果你使用MD5或SHA-1,我不会担心算法,如果你需要开发一个冲突管理策略,那么你绝对不应该使用随机的或基于哈希的ID,因为集群环境中的冲突管理是复杂的,需要额外的查询。
1.随机值和散列值被有意地分散在数字行上。这(a)将需要更多的B树索引始终保存在内存中,(b)可能会由于B树重新平衡而导致可变插入性能。MongoDB被优化为处理ObjectID,ObjectID以升序出现(粒度为1秒)。您可能最好坚持使用它们。

yqlxgs2m

yqlxgs2m3#

我刚刚找到了我的一个问题的答案,关于索引性能:
如果_id的顺序定义得很好,那么在插入时,_id索引的整个b树都不需要加载。BSON ObjectIds具有这个属性。
来源:http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

z6psavjg

z6psavjg4#

它的好坏取决于它的唯一性。当然MongoDB提供的ObjectId是非常唯一的,所以这是一件好事。只要你能复制这种唯一性,你就应该没事。
使用自己的ID没有固有的风险/性能损失。我猜以字符串形式使用它可能会消耗更多的索引/存储/查询能力,但您以MongoID(ObjectId)形式使用它,这应该保留了不以简单字符串存储它的优点。

相关问题