Mongoose Find查询无结果,Mongo Shell可正常返回结果求助
Mongoose find查询无结果但MongoDB Compass可查询的解决方案
可能的原因及修复方案
1. 正则表达式特殊字符未转义
ISBN通常包含-、.等字符,这些在正则表达式中属于元字符,直接作为$regex的参数会被解析为正则语法,而非普通字符,导致匹配失败。
修复方法:先转义searchPattern中的正则特殊字符:
function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // 转义所有正则元字符 } let { ISBN } = req.body; let searchPattern = escapeRegExp(ISBN); // 转义后再用于正则查询
2. 混用await与then/catch且存在无效的setTimeout
代码中同时使用await和then/catch属于冗余写法,且setTimeout内的return res无法正确响应请求(因为setTimeout回调是异步执行,此时then的回调已完成)。
修复后的代码:
let { ISBN } = req.body; let searchPattern = escapeRegExp(ISBN); try { const result = await booksModel.find({ ISBN: { $regex: searchPattern, $options: "i" } }); // 去掉不必要的setTimeout,直接响应 return res.status(200).json({ message: `${result.length} books found`, books: result }); } catch (error) { console.log(error); return res.status(404).json({ message: "Error while searching.", error: error.message }); }
3. 确认参数与数据库字段一致性
- 打印
req.body.ISBN的值,确认和你在Compass Shell中使用的查询参数完全一致(包括空格、大小写、特殊字符)。 - 检查数据库中ISBN字段的存储格式,确保是字符串类型,且字段名确实是
ISBN(Mongoose默认区分大小写,若数据库中是isbn小写则查询失败)。
4. 直接测试原始查询
可以在代码中直接使用Compass中能成功的查询字符串,快速定位问题:
// 替换成你在Compass中用的ISBN值 const testISBN = "978-1234567890"; const result = await booksModel.find({ ISBN: testISBN }); console.log(result);
如果这样能查到结果,说明问题出在正则转义或参数传递上。
内容的提问来源于stack exchange,提问作者usama rashad
相关产品推荐
相关产品推荐

