PHP中MongoDB删除无coordinates.coordinates的推文文档失败排查
解决PHP中MongoDB删除无坐标字段文档的问题
嘿,我明白你的困扰——同样的删除逻辑在Mongo Shell里跑得好好的,到PHP代码里就没效果了对吧?别担心,这只是个很容易忽略的小语法问题!
问题根源
先看看你写的PHP代码:
<?php //this remove line doesn't work. $collection->remove(array(["coordinates.coordinates"=> ['$exists'=> false]])); ?>
你在这里多嵌套了一层数组!MongoDB的PHP驱动期望直接传入查询条件的关联数组,但你把实际的查询文档又套了一层array(),导致驱动无法正确识别你要匹配的条件,自然找不到需要删除的文档。
而Mongo Shell里的命令db.sample_collection.remove({"coordinates.coordinates": {$exists: false}})是直接传入了正确的查询文档,所以能正常工作。
正确的代码实现
根据你使用的MongoDB PHP驱动版本,分两种情况给出正确写法:
情况1:使用旧版mongo扩展(PHP 5.x 常用)
直接去掉外层多余的数组包裹,用单层关联数组作为查询条件:
<?php // 正确的删除语句 $collection->remove(array("coordinates.coordinates" => array('$exists' => false))); ?>
情况2:使用新版mongodb扩展(PHP 7+ 官方推荐)
现在官方更推荐使用deleteMany()方法来批量删除文档,写法更简洁:
<?php // 正确的批量删除语句 $collection->deleteMany(["coordinates.coordinates" => ['$exists' => false]]); ?>
小提示
如果你是第一次用新版扩展,记得确认你的PHP环境已经正确安装了mongodb扩展以及MongoDB PHP Library,避免因版本兼容问题导致其他异常。
内容的提问来源于stack exchange,提问作者codex
相关产品推荐
相关产品推荐

