江邊望海的技術人生
分享真知
MongoDB更新记录的细节优化

在日常的开发中,经常需要更新数据。而很多判断语句写的并不严谨。在程序中的正常与否的判断应该建立在服务可用的基础上的。如果服务不可用,判断是没有意义的。

比如,对MongoDB数据库中的记录进行更新的时候。是否更新成功应该是取更新后的结果。这个在PHP的MongoDB扩展手册里面已经有说明了。

$collection = (new MongoDB\Client)->test->restaurants;

$updateResult = $collection->updateOne(
    [ 'restaurant_id' => '40356151' ],
    [ '$set' => [ 'name' => 'Brunos on Astoria' ]]
);

printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());

更新后,通过getModifiedCount() 获取更新的记录数。如果记录数存在则证明更新成功。但是,我们经常在更新记录状态的时候喜欢把更新时间也带上。但是如果带上就很难识别是否真的更新成功了。

比如,我们要软删除一条记录,第一次删除的时候已经将这条记录更新成-1了(-1代表标记删除),但是如果你再次执行的时候,虽然没有对这条记录的做任何更改,但是由于你加上了一个更新时间,这个时候通过getModifiedCount()获得还是更新了一条。如果这样,在程序里面做是否更新成功的判断就没有任何意义了,毕竟第二次更新这条记录的时候,状态值并没有变化,而是记录的更新时间变化了而已。


更有甚者会先通过查询出来记录,然后在更新操作,本身这种思路就有很大的效率风险。既然,MongoDB的PHP扩展已经给了我们updateOne和updateMany这两个方法,为什么不用呢?非要再查一下,根本没有这个必要。