MongoDB API查询过滤不符合预期:为何负数nmbr文档被返回?
问题根源分析
你的问题出在路由路径的错误定义上:
- 你把查询参数格式
?nmbr[gt]=0写到了Express的路由路径里,这是完全错误的。Express的路由路径仅负责匹配URL的路径部分(?之前的内容),查询参数不需要也不应该写在路由路径中。 - 你的路由
/tests/:par?nmbr[gt]=0会被解析为:路径必须是/tests/后跟随可选的par参数,然后必须紧接着nmbr[gt]=0这串固定字符(比如匹配/tests/xnmbr[gt]=0这种不符合你需求的路径)。
而你实际发送的请求localhost:5000/tests/x?nmbr[gt]=0中,?nmbr[gt]=0是查询参数,不属于路径部分,所以这个请求根本没有匹配到你写的这个路由,而是匹配了其他更通用的路由(比如你可能定义过的/tests/:par),那个路由里没有添加nmbr: {$gt: 0}的过滤条件,因此返回了所有letter为x的文档。
修复方案
1. 修正路由路径
首先把路由改成正确的格式,只保留路径参数:par,查询参数不需要写在路由里:
app.get('/tests/:par', (req, res) => { // 后续逻辑 });
2. 按需处理查询参数
如果你想让nmbr[gt]作为动态的查询条件(而不是固定死$gt:0),可以从req.query中获取查询参数并构建MongoDB查询条件:
app.get('/tests/:par', (req, res) => { // 基础查询条件 const query = { letter: req.params.par }; // 检查是否有nmbr[gt]查询参数 if (req.query.nmbr?.gt) { // 注意转换为数字类型,因为查询参数默认是字符串 query.nmbr = { $gt: parseInt(req.query.nmbr.gt) }; } Test.find(query) .then(data => res.status(200).json({ data })); });
3. 固定条件的简化写法
如果你确实只需要过滤nmbr>0的文档,不需要动态参数,那直接保留固定条件即可,但必须确保路由路径正确:
app.get('/tests/:par', (req, res) => { Test.find({ letter: req.params.par, nmbr: { $gt: 0 } }) .then(data => res.status(200).json({ data })); });
这样修改后,发送localhost:5000/tests/x?nmbr[gt]=0(动态参数版本)或者直接localhost:5000/tests/x(固定条件版本),就能正确返回letter为x且nmbr为正整数的文档了。
内容的提问来源于stack exchange,提问作者Miriyan Asenov
相关产品推荐
相关产品推荐

