MongoDB Shell中如何正确使用带$and查询条件的deleteMany()方法
问题原因分析
- 最高发原因是Mongo Shell连接的目标数据库错误:Mongo Shell启动后默认连接
test数据库,如果你要操作的infrastructure集合不在test库中,没有执行use 目标库名切换到对应数据库的话,就会匹配不到任何文档,自然返回删除数为0,这也是Compass能正常匹配、Shell执行失败的最常见场景。 - 其次可能是过滤条件的冗余写法导致的兼容问题:虽然显式写
$and语法上没有错误,但MongoDB默认对同一层级的多个查询条件就是逻辑与关系,不需要额外包裹$and,部分旧版本Shell可能存在特殊解析问题。 - 小概率场景为字段值存在不可见字符:比如
properties.type.primary/properties.type.secondary的值前后存在空格、换行符,Compass的查询做了兼容处理但Shell执行严格匹配。
解决步骤
- 首先校验Shell连接的数据库是否正确,先执行以下验证命令:
# 切换到你实际存储infrastructure集合的数据库,替换掉尖括号内容 use <你的目标数据库名> # 先执行计数校验过滤条件是否能匹配到文档 db.infrastructure.countDocuments({"properties.type.primary": "pipelines", "properties.type.secondary": "oil"})
如果计数返回182,说明连接和过滤条件都正确,再执行删除操作即可。
2. 推荐使用简化版删除语句,不需要显式声明$and:
db.infrastructure.deleteMany({ "properties.type.primary": "pipelines", "properties.type.secondary": "oil" })
- 如果上述计数返回还是0,说明字段值可能有隐藏字符,可以用正则兼容匹配验证:
# 正则忽略前后空白字符匹配,验证是否是值的格式问题 db.infrastructure.countDocuments({ "properties.type.primary": /^\s*pipelines\s*$/, "properties.type.secondary": /^\s*oil\s*$/ })
如果这个语句返回182,直接用该正则条件执行deleteMany即可完成删除。
内容的提问来源于stack exchange,提问作者bkleeman
相关产品推荐
相关产品推荐

