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

Node.js查询MongoDB年份过滤返回空数组问题排查

解决MongoDB按年份过滤返回空数组的问题

问题场景

开发后端应用,基于MongoDB Atlas样本数据库实现数据查询过滤。普通GET请求能正常返回数据,但执行GET http://localhost:5000/api/v1/mflix?year=1903时,moviesList返回空数组[]且无报错。但类似GET localhost:5000/api/v1/mflix?rated=TV-G这类字符串参数的过滤请求能正常返回结果。

问题根因

HTTP请求的URL查询参数(req.query)默认都是字符串类型,但数据库里的year字段是数字类型(比如示例文档里的year: 1903)。MongoDB的查询是严格匹配类型的,用字符串"1903"去匹配数字1903自然找不到任何文档,所以返回空数组。

解决方案

把从req.query获取的year参数转换成数字类型后再传入DAO层即可。可以用Number()或者parseInt()进行转换,同时建议添加参数合法性校验,避免非数字值导致的问题。

代码修改示例

原问题代码:

let filters = {}
if(req.query.year){
    filters.year = req.query.year // 这里需要修改
}

const {moviesList, totalNumMovies} = await MflixDAO.getMovies({
    filters,
    page,
    moviesPerPage,
})

修改后:

let filters = {}
if(req.query.year){
    // 转换成数字,同时校验是否为有效数字
    const year = Number(req.query.year)
    if(!isNaN(year)){
        filters.year = year
    }
}

const {moviesList, totalNumMovies} = await MflixDAO.getMovies({
    filters,
    page,
    moviesPerPage,
})

补充说明

你的DAO层代码逻辑是正常的,问题完全出在参数类型不匹配上。当filters.year是数字类型时,DAO里的query = {"year": {$eq: filters["year"]}}就能正确匹配数据库中的数字字段,返回预期结果。

内容的提问来源于stack exchange,提问作者Juan David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:15:33