php出现往mongodb中写入顺序与实际写入顺序不一致的的情况

如果你查询mongodb中某个集合查询条件中恰巧有一项时顺序递增的值(类似mysql中的自增主键字段),且按这个值的范围查询,而又恰巧排序所用的字段为_id,那么此时代码查询返回的结果在部分情况下会有问题,即会漏掉某些记录。

以下面两段代码为示例来说明

$resultOne= Feeds::find([
                [
                    'uuid' => ['$gt' => (int)$lastTid],
                    'isdelete' => 0,
                ],
                'sort' => ['uuid' => -1],
            ]);


$resultTwo = Feeds::find([
                [
                    'uuid' => ['$gt' => (int)$lastTid],
                    'isdelete' => 0

                ],
                'sort' => ['_id' => -1],
            ]);

其中$lastTid为上次查询结果中uuid为最大的值,可以理解和php中用microtime(true)生成的值的意义一样。

$resultOne变量返回的结果不会漏掉某些结果,比如有一组uuid从大到小的值为2097935,2097934,2097933,2097932,2097931这五项值,$resultOne会正常返回这五项的值。


但是$resultTwo在部分情况下会出现查找到了2097935和2097931,但没有查找到2097934,2097933,2097932这三项。原因是什么呢?

原因是由于uuid在触发写入feeds前是严格按递增的顺序已生成好的,但如果并发量高的情况下,先生成的uuid最终并不一定先写入feeds集合中,即在同一时刻,在同一个for循环中往mongodb中写入单条记录,先执行的写记录请求的并不一定先写入mongodb中,最终视mongodb写入的情况而定,例如:

for($i=0 $i<10; $i++) {
    $this->mongo->feeds->insert(['uuid' => $uuid, 'isdelete' => 0]);
}
上面的就有可能出现第$i=8条比第$i=5条先写入到feeds集合中,这种情况并不是每次都会出现,而是偶尔会出现。

结论就是php调用php的mongo扩展往mongodb中写入数据时与最终实际写入的顺序有可能不一样。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值