如何参数化实现MongoDB多集合中匹配正则子串的文档批量删除
MongoDB多集合批量参数化删除老旧文档实现方案
问题原因
你之前的两种写法存在语法/逻辑错误:
- 第一种写法
$regex的查询结构写错,且没有正确构造正则匹配参数 - 第二种写法误用
remove的let参数,$in是精确匹配逻辑,无法实现子串匹配,且let参数不适用于简单删除的查询条件场景
单集合参数化删除正确写法
直接在Mongo Shell中定义变量作为匹配参数,传入deleteMany的查询条件即可:
// 自定义要匹配的key子串参数 const keySubStr = "2021-08-01_2021-08-11_Reported"; // 执行删除,$regex实现包含匹配,如需全匹配可改为$regex: `^${keySubStr}$` db.df_FI.deleteMany({ key: { $regex: keySubStr } });
可选配置:如需忽略大小写匹配,可添加$options: "i"参数:
db.df_FI.deleteMany({ key: { $regex: keySubStr, $options: "i" } });
多集合批量删除完整脚本
无需逐行写集合删除语句,直接循环处理指定集合即可:
// 1. 配置公共匹配参数 const matchKey = "2019-05-01_2019-05-30_Reported"; // 2. 配置要处理的目标集合列表 const targetColls = [ "df_FI", "df_Final_FI", "df_Manual_Booked_FI", "df_Manual_Booked_Final_FI" ]; // 3. 循环执行删除并输出结果 targetColls.forEach(collName => { const res = db.getCollection(collName).deleteMany({ key: { $regex: matchKey } }); print(`集合${collName}成功删除${res.deletedCount}条文档`); });
注意事项
- 执行删除前建议先替换
deleteMany为countDocuments验证匹配数量,确认无误后再执行删除,避免误删:const matchCount = db.getCollection(collName).countDocuments({key: {$regex: matchKey}}); - 如果是精确匹配整个key的值等于参数,直接写
key: matchKey即可,不需要用正则,查询性能更高 - 注意你示例中第三个集合的匹配值里日期中间是空格而非横杠,如需匹配该异常值记得修正参数里的对应字符
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

