1

根据有关该功能的Meteor 文档,Mongo.Collection.insert()

insert 将为您传递的对象生成一个唯一的 ID,将其插入到数据库中,并返回该 ID。

它也可以异步工作:

如果您确实提供了回调,insert 仍会立即返回 ID。

是否可以保证生成的 _id 是全局唯一的?Meteor 的 Minimongo 是如何在客户端生成这样一个 _id 的呢?

4

1 回答 1

3

由于 Meteor 是开源的,您可以确切地看到这是如何完成的。

从自述文件:

random 包提供了几个用于生成随机数的函数。它在可能的情况下使用加密强伪随机数生成器,但当加密强随机性不可用时(在较旧的浏览器或没有足够熵播种加密强生成器的服务器上)时,它会回退到较弱的随机数生成器。

Random.id([n])- 返回一个唯一标识符,例如“Jjwjg6gouWLXhMGKW”,它可能在全世界都是唯一的。可选参数 n 以字符为单位指定标识符的长度,默认为 17。

简短的回答是 Meteor 使用密码学(也称为 @Kyll 的数学)来生成一个随机 id,该随机 id 在所有 mongo 数据库中的所有对象中应该是全局唯一的。“运气”部分是两个对象最终可能具有相同的 id 的可能性很小。现在_id密钥在 mongo 中被索引为唯一,因此如果存在欺骗,插入将失败。我怀疑 Meteor 有错误处理来处理这种可能性。

于 2015-10-25T16:54:09.343 回答