MongoDB同字段多正则匹配删除文档异常求助
解决MongoDB多条件删除文档的问题
我来帮你搞定这个删除文档的坑!你的问题出在查询条件的写法上——MongoDB的查询文档里如果出现重复的键(比如你这里两次写了"variable"),只会保留最后一个键对应的条件,完全忽略第一个。
你原来的语句:
db.getCollection('system_parameter').remove( { "variable":/^pickup_kota/, "variable": { $nin: [ /^pickup_kota_jakarta/ ] } } )
实际上被MongoDB解析成了:
db.getCollection('system_parameter').remove( { "variable": { $nin: [ /^pickup_kota_jakarta/ ] } } )
这就导致所有variable字段不是以pickup_kota_jakarta开头的文档都被删掉了,包括那些和pickup_kota完全无关的文档(比如你提到的some_doc前缀的),这就是为什么会出现误删的情况。
正确的解决方案
有两种简洁可靠的写法可以实现你的需求:
方法1:用$and明确组合两个条件
通过$and把两个条件绑定在一起,确保MongoDB同时执行两个判断:
db.getCollection('system_parameter').remove({ $and: [ { "variable": /^pickup_kota/ }, { "variable": { $nin: [ /^pickup_kota_jakarta/ ] } } ] })
方法2:用正则负向前瞻简化条件
用一个正则表达式同时实现“以pickup_kota开头”且“不以pickup_kota_jakarta开头”的判断,更简洁:
db.getCollection('system_parameter').remove({ "variable": /^pickup_kota(?!_jakarta)/ })
这里的(?!_jakarta)是负向前瞻断言,表示匹配到pickup_kota之后,后面不能紧跟着_jakarta,完美过滤掉你想排除的文档。
重要提醒
在执行删除操作前,一定要先用find()测试你的条件是否正确,避免误删:
// 先确认要删除的文档列表 db.getCollection('system_parameter').find({ "variable": /^pickup_kota(?!_jakarta)/ })
内容的提问来源于stack exchange,提问作者Rifi331
相关产品推荐
相关产品推荐

