为集合生成唯一的ObjectId

时间:2017-03-30 22:19:43

标签: node.js mongodb mongoose uuid objectid

我想为资源生成一个唯一的ObjectId,以便为客户端提供nodejs mongodb驱动程序。

IE:

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

阅读ObjectId似乎有些情况下这个id可能不是唯一的。即使这种情况非常罕见,我仍然无法抓住重复的身份。

问题#1,使用此驱动程序可能(尽管不太可能)获取重复的ID执行此操作:

var objectId = new ObjectID();

问题#2(如果上述不是100%保证给出唯一ID):

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

如果驱动程序或mongo服务器确保(100%的时间)对于一个集合,每个新文档都获得一个唯一的id,我总是可以有一个只有id的集合,然后在生成一个新的空文档时我将确保获得一个独特的ObjectId。然而,为了存储ID,有另外一个集合似乎有些过分。

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

1 个答案:

答案 0 :(得分:0)

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

UPDATE:在读取代码库后再次,如果“假设”库生成的objectID不唯一,则答案为否。我们不确定库是否唯一,但我们确保重复错误并不重要的是谁或什么发送了id。

这是一个过程:  1.生成ID  2.直接发送到服务器。  3.返回结果。

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