MongoDB 实战中,记录被掉在坑中的窘境

公司采用 MongoDB 作为新项目的数据存储方式,以前没那么大规模用过,心里还是有点悬,不知道会掉在哪些坑里,先给自己挖个坑。

mongoDB 的第一个大坑:好大的坑,让我忙了一个下午。。。mongodb对自己开发的nodejs驱动太不负责任了吧。。。

问题描述:采用异步方式插入三条数据(三条数据的插入间隔时间不超过1s),当第一条数据写入但还没有执行回调的时候就开始插入下一条数据就会出现索引异常,提示大意就是插入了两条相同键值的记录。

为什么呢:之前在用 php 写入数据的时候不会发生这个问题,大概是因为 php 是顺序执行的,没有异步的特征。看了官方的文档,mongodb 的 _id 生成机制是基于时间戳,当前进程ID以及当前计数器的值,由于时间很短,当前时间戳是一样的,当前的进程也是一样的,问题发生的关键就是 mongodb nodejs 驱动在还没有执行回调的时候计数器的值不会增加(天啊,mongo是怎么想的啊,mysql 很早就避免了这个问题,执行一次id就会递增一次,而且不管这条信息是否执行成功,保证了是原子性的递增方式,这样才比较有业界良心啊),这样就造成了nodejs几乎同时写入mongodb时会发生索引错误,就是11000错误代码

方案:采用自己生成的 _id 来代替 mongo 生成的 _id 值,这样就能够有效进行避免。

    原文作者:odirus
    原文地址: https://segmentfault.com/a/1190000000457623
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞