You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:24