【问题标题】:Generate a unique ObjectId for a collection为集合生成唯一的 ObjectId
【发布时间】:2017-03-30 22:19:42
【问题描述】:

我想为资源生成一个唯一的 ObjectId,以使用 nodejs mongodb 驱动程序回馈客户端。

IE:

var ObjectID = require('mongodb').ObjectID;
var objectId = new ObjectID();

阅读有关 ObjectId 的信息,似乎在某些情况下此 id 可能不是唯一的。尽管这种情况极为罕见,但我仍然不能冒险重复 id。

问题 #1,使用此驱动程序是否有可能(即使不太可能)获得重复的 id 这样做:

var objectId = new ObjectID();

问题 #2(如果以上不是 100% 保证提供唯一 ID):

此驱动程序是否保证对于某个集合,插入新文档时自动创建的 ObjectId 是唯一的?如果是,如何?如果是,我可以在没有集合的情况下自己调用 new ObjectID() 时以某种方式复制该行为吗?

如果驱动程序或 mongo 服务器确保(100% 的时间)对于一个集合,每个新文档都有一个唯一的 id,我总是可以有一个只有 id 的集合,然后在为此生成一个新的空文档时我会确保我得到一个唯一的 ObjectId。然而,仅仅为了存储 id 而拥有另一个集合似乎有点过头了。

话虽如此,有些人可能会问为什么不在集合中生成 ObjectId 并稍后使用数据更新该文档。答案是,在我的情况下,数据可能永远不会稍后出现,我不想实现逻辑来检查仅包含 id 的空文档。

【问题讨论】:

  • 如果反对者能解释原因,那肯定会有所帮助。

标签: node.js mongodb mongoose uuid objectid


【解决方案1】:

生成相同的 ObjectID 的可能性很小,因为 mongo 保证唯一的 ID。 objectID 是使用两个相同值和两个不同值(unix 纪元时间和一个随机值)的组合创建的。但是,在任何重复的情况下,您都不能插入文档,因为 objectID 充当主键,insert 函数将返回 duplicate key error 给您的回调。阅读更多here。如果 mongo 节点本机 library 创建重复的 ObjectID,则会返回相同的错误。

更新:再次阅读代码库后,如果“假设”由库生成的 objectID 不是唯一的,则答案是否定的。库不能保证 id 是唯一的,但我们可以确保重复错误与谁或什么发送了 id 无关。

流程如下: 1.生成ID 2. 直接发送到服务器。 3. 返回结果。

Mongo 没有在 nodeJS 中循环使用现有的 id,因为库没有将它存储在缓存中。阅读library 的代码库。

【讨论】:

  • 谢谢@Luis,但这并不能回答我的问题。对于您提供的第一个链接,如果您没有在插入时为 mongo 提供 _id,mongo 将为您提供一个 id。但是,该文档并未提及 mongo 生成的 _id 是否是重复的,即使它很少见。所以问题仍然存在,当 mongo auto 生成一个 _id 时,它是否有额外的逻辑来确保集合中不存在 _id?
  • 在 node mongo 原生库中会返回重复错误。我为它链接了代码库。我也回答了这个问题“如果 mongo 节点本机库创建重复的 ObjectID,则会返回相同的错误。”
  • 再次请忽略驱动,mongo不驱动是什么?我可以在驱动程序中设置 forceServerObjectId = true,这意味着 mongo 将创建_id。那时,就 _id 而言,驱动程序只是一个通道。找不到 mongo 实际记录的位置,如果您不传递 _id 并且 mongo 生成一个,它可能会在该集合中生成一个副本。这让我相信 mongo 服务器将防止在集合中生成重复的 _id。
  • 哦,好吧,您的问题与节点 mongo 驱动程序无关。如果 forceServerObjectId 为真,那么驱动程序不会通过给您 ObjectId 来更改您的文档,但服务器会保证您拥有唯一的 ObjectID。我现在明白你的问题了。
  • 是的,很抱歉造成混乱。真正的意思是,如果驱动程序或服务器可以确保为集合生成的 _id 是唯一的,我可以通过拥有一个仅用于唯一 _id 生成的集合来解决我的问题。但前提是驱动程序或服务器实际上会确保这一点。根据您的回答,驱动程序无法确保这一点,但我无法在 mongo 服务器文档中的任何地方找到明确的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
相关资源
最近更新 更多