【问题标题】:Where is the ObjectID `_id` generated?ObjectID `_id` 是在哪里生成的?
【发布时间】:2020-01-08 11:04:49
【问题描述】:

当将文档插入 MongoDB 并且没有明确分配 _id 时,会自动分配一个。我的问题是,这个分配是在哪里进行的,ID 是在哪里生成的?是客户端在发送插入请求之前生成的,还是在服务器端生成的?

我的问题的上下文是我想使用 MongoDB 来构建一个“事件存储”(在“事件源”的意义上)。部分原因是商店强制对事件进行排序。 MongoDB中已经有一个内部排序,这就足够了。但是,在某些时候,我可能不得不在某些时候恢复阅读活动。为此,我不能在过滤器表达式中使用最后处理的 ID,因为 ID 的进程唯一和随机部分不保证任何排序。但是,ID 的时间戳部分可以做到这一点,只要它保证单调上升。

如果 ID 是由服务器生成的(并且该服务器没有做任何有趣的事情,比如有一个向后跳跃的系统时钟),那么只有一个地方可以生成这些 ID。不同系统之间的系统时钟和延迟差异变得无关紧要。随后,我可以依靠 ID 的时间戳部分单调递增。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    所有客户端(例如,Mongo Shell、Python、Java 或 NodeJS 应用程序)都通过 驱动程序 软件连接到 MongoDB 数据库服务器。如果应用程序没有向_id 字段提供值,则驱动程序会生成一个值。 (注意:我相信,不确定,如果驱动程序未能分配一个,数据库服务器会为_id 字段分配值)。默认的_id字段值是BSON类型ObjectId


    (1) 根据 MongoDB 文档,ObjectId 是由客户端生成的:

    重要

    虽然 ObjectId 值应随时间增加,但它们不会 必然单调。这是因为他们:

    • 仅包含一秒的时间分辨率,因此在同一秒内创建的 ObjectId 值没有保证顺序,并且
    • 由客户端生成,可能具有不同的系统时钟。


    (2) 那么,如何确保您的 ObjectId 是唯一的?

    请参阅此 MongoDB 博客文章Generating Globally Unique Identifiers for Use with MongoDB 主题:

    • 确保数据库级别的标识符唯一性
    • 使用 ObjectID 作为唯一标识符

    【讨论】:

    • 谢谢,这似乎回答了我的问题。
    猜你喜欢
    • 2015-07-19
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2023-03-19
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多