根据有关该功能的Meteor 文档,Mongo.Collection.insert()
insert 将为您传递的对象生成一个唯一的 ID,将其插入到数据库中,并返回该 ID。
它也可以异步工作:
如果您确实提供了回调,insert 仍会立即返回 ID。
是否可以保证生成的 _id 是全局唯一的?Meteor 的 Minimongo 是如何在客户端生成这样一个 _id 的呢?
根据有关该功能的Meteor 文档,Mongo.Collection.insert()
insert 将为您传递的对象生成一个唯一的 ID,将其插入到数据库中,并返回该 ID。
它也可以异步工作:
如果您确实提供了回调,insert 仍会立即返回 ID。
是否可以保证生成的 _id 是全局唯一的?Meteor 的 Minimongo 是如何在客户端生成这样一个 _id 的呢?
由于 Meteor 是开源的,您可以确切地看到这是如何完成的。
从自述文件:
random 包提供了几个用于生成随机数的函数。它在可能的情况下使用加密强伪随机数生成器,但当加密强随机性不可用时(在较旧的浏览器或没有足够熵播种加密强生成器的服务器上)时,它会回退到较弱的随机数生成器。
Random.id([n])
- 返回一个唯一标识符,例如“Jjwjg6gouWLXhMGKW”,它可能在全世界都是唯一的。可选参数 n 以字符为单位指定标识符的长度,默认为 17。
简短的回答是 Meteor 使用密码学(也称为 @Kyll 的数学)来生成一个随机 id,该随机 id 在所有 mongo 数据库中的所有对象中应该是全局唯一的。“运气”部分是两个对象最终可能具有相同的 id 的可能性很小。现在_id
密钥在 mongo 中被索引为唯一,因此如果存在欺骗,插入将失败。我怀疑 Meteor 有错误处理来处理这种可能性。