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
相关产品推荐
相关产品推荐

