在MongoDB中创建自定义对象ID

时间:2012-08-31 07:57:42

标签: mongodb

我正在创建一个服务,我将使用MongoDB作为存储后端。 该服务将生成用户输入的哈希值,然后查看我们的数据集中是否已存在相同的哈希值(+输入)。

哈希将是唯一但随机的(=非增量/顺序),所以我的问题是:

  1. 是-legitimate-使用随机值作为对象ID吗?例如:
  2. $object_id = new MongoId(HEX-OF-96BIT-HASH);

    或者MongoDB会不同于其他服务器生成的ObjectID,因为“真正的”ObjectID还包含时间戳,machine_id等?

    使用“随机”值的优缺点是什么?我想当新的_id不以任何方式增量时,引擎更新插入索引在统计上会更慢 - 我是否正确呢?

4 个答案:

答案 0 :(得分:41)

是的,对对象id使用随机值是完全正确的,如果存储的文档的_id字段中存在某个值,则将其视为objectId。

由于_id字段始终被索引,并且主键,因此您需要确保为每个对象生成不同的objectid。 有一些指南可以优化用户定义的对象ID:

http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Usethecollections%27naturalprimarykey%27intheidfield

答案 1 :(得分:10)

虽然任何值(包括哈希值)都可用于_id字段,但我建议不要使用随机值,原因有两个:

  1. 如果您为两个不同的对象生成相同的随机值,则可能需要开发冲突管理策略。在这个问题中,您暗示您将使用某种类型的哈希算法生成ID。我不会将这些值视为“随机”,因为它们基于您使用哈希消化的内容。然后,碰撞的概率是内容的多样性和散列算法的函数。如果您使用的是MD5或SHA-1,我不会担心算法,只会考虑您正在散列的内容。如果您需要开发冲突管理策略,那么您绝对不应该使用随机或基于散列的ID,因为群集环境中的冲突管理很复杂并且需要额外的查询。

  2. 有意地将随机值和散列值分散在数字行上。 (a)将需要更多的B树索引始终保存在内存中,并且(b)由于B树重新平衡而可能导致可变的插入性能。 MongoDB经过优化,可以处理ObjectID,它按升序排列(具有一秒的时间粒度)。你最好坚持使用它们。

答案 2 :(得分:6)

它的好坏取决于它的独特性。当然,MongoDB提供的ObjectId非常独特,所以这是一件好事。只要你能复制那种独特性,你应该没事。

使用您自己的ID没有固有的风险/性能损失。我想以字符串形式使用它可能会消耗更多的索引/存储/查询功能,但是你在MongoID(ObjectId)形式中使用它应该保留不将它存储在简单字符串中的强度。

答案 3 :(得分:6)

我刚刚找到了一个关于索引性能的问题的答案:

  

如果_id的定义稍微明确,那么在插入时,不需要加载_id索引的整个b树。 BSON ObjectIds具有此属性。

来源:http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs