【问题标题】:Where does the _id being generated (and checked)?_id 在哪里生成(和检查)?
【发布时间】:2015-07-19 02:54:09
【问题描述】:

现在数据库操作插入似乎是在插入后同步返回_id,因此这里不需要回调。

问题在于 _id 在哪里生成(和检查),因为这似乎是在 miniMongo 上完成的快速同步操作,但是没有某个集合的 _id 的完整列表,miniMongo 怎么可能检查_id是否重复??

【问题讨论】:

    标签: meteor minimongo


    【解决方案1】:

    在客户端上使用Collection.insert 时,_id 是使用random uuid algorithm 在客户端上生成的,因此看似完美的延迟补偿客户端插入。

    Collection.insert被实现为Meteor.method的特例,我们知道在客户端运行客户端模拟的同时,触发了相应的服务端操作,客户端文档随同发送到服务端它在本地生成_id

    在服务器上,检查_id 是否正确(真正唯一)并且服务器向客户端确认有效插入。

    如果客户端生成的_id 毕竟不是唯一的,那么插入将失败并出现“重复键错误”(这可能发生在 0.001% 的时间 - 概率更低,您必须重新提交您的客户表格或其他)。

    为了具体回答您的问题,可以在客户端插入的情况下在浏览器中生成_id,但最终在服务器上检查其有效性。

    编辑:我最初假设 Meteor 试图从重复密钥错误中恢复并生成一个新密钥以避免重复并将其传播到客户端,我测试了用例并发现我错了,谢谢@Tom Freudenberg指出这一点。

    【讨论】:

    • 你 100% 确定这个顺序吗?自己直接设置_id是什么意思:col.insert({ id: 'mykey', ... });。这是有效的,在这种情况下,您会遇到密钥违规错误。从我的角度来看,_id 总是由内部 Mongo.ObjectID() 方法(docs.meteor.com/#/full/mongo_object_id)生成(如果没有像上面那样给出)唯一。所以我几乎可以肯定,一旦指定了 _id 在插入期间或之后,就永远不会更改它。如果不合适,总会出错。
    • 请问您是从哪里得到这些信息的,非常感谢您这么快回答!
    • @Ziac : 主要来自阅读 Meteor 官方讨论组,MDG 会随机讨论 Meteor 内部实现,有时也会直接阅读源代码。
    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多