MongoDB find()正则表达式过滤无效,返回空数组求助
问题原因及解决方案
你的问题出在正则表达式的转义字符处理上:
- JavaScript字符串中,
\是转义符,直接写"\d\d\d\d-"时,\d会被解析成无效转义(实际变成普通字符d),最终生成的正则是dddd-<month>-dd,自然匹配不到YYYY-MM-DD格式的日期。
修复步骤
- 修正正则的转义字符:把字符串里的
\d改成\\d,让RegExp能正确识别数字匹配元字符:
const regexp = new RegExp("\\d\\d\\d\\d-" + month + "-\\d\\d");
或者用ES6模板字符串,同样需要双重转义,同时用更简洁的量词写法:
const regexp = new RegExp(`\\d{4}-${month}-\\d{2}`);
- 可选优化:用日期范围查询替代正则
正则匹配日期效率较低,MongoDB推荐用日期范围查询。假设你的date字段是字符串格式(如"2024-05-15"),可以构造当月的起始和结束日期:
// 假设month是两位数字,比如"05" const year = new Date().getFullYear().toString(); // 或根据业务需求指定年份 const startDate = `${year}-${month}-01`; const endDate = `${year}-${month}-31`; const allExpenses = await Expense.find({ date: { $gte: startDate, $lte: endDate } }); const allEarnings = await Earning.find({ date: { $gte: startDate, $lte: endDate } });
如果date是Date类型,就构造Date对象进行范围查询,效率会更高。
验证方法
修改后可以打印regexp.source查看实际正则表达式,确认是否是预期的\d{4}-<month>-\d{2}。
内容的提问来源于stack exchange,提问作者legendman
相关产品推荐
相关产品推荐

