PHP MongoDB使用$pull移除子文档时出现‘Cannot apply $pull to a non-array value’错误求助
解决MongoDB中使用$pull移除子文档报错的问题
你遇到的报错原因很直接:$pull操作符仅适用于数组类型的字段,但你的users字段是一个键值对形式的文档(对象),并非数组,所以MongoDB会抛出"Cannot apply $pull to a non-array value"的错误。
要移除users对象里的"47"这个键值对,你需要改用**$unset操作符**,它的作用就是删除文档中的指定字段。
正确代码示例
从你给出的数组格式来看,假设你使用的是PHP,正确的写法如下:
// 定位目标文档的条件(用_id定位会更精准) $filter = ['invoice_id' => 12121212]; // 构造更新操作:删除users下的47键 $update = ['$unset' => ['users.47' => '']]; // 执行更新 $result = $collection->updateOne($filter, $update);
补充说明
- 使用
$unset时不需要严格匹配对应的值,只要正确写出要删除的键路径即可,值可以填任意内容(通常写空字符串或true都能生效)。 - 如果你的业务场景需要
users是数组类型(比如后续要存储多条结构化的用户记录),可以先调整文档结构为数组形式,比如:
这时再用{"_id":{"$oid":"6285eddb143ac418a7641872"}, "invoice_id":12121212, "users":[{"id":"73", "date":"2020-05-25 15:43:27"}, {"id":"224", "date":""}]}$pull就能正常移除指定元素了,示例代码:$update = ['$pull' => ['users' => ['id' => '47', 'date' => '2022-02-21 17:26:00']]];
内容的提问来源于stack exchange,提问作者Shail
相关产品推荐
相关产品推荐

