Mongoose中$in操作符筛选多分类博客返回空数组如何解决
问题根因
你当前的问题是前端数组类型的查询参数传递方式错误,导致后端获取到的categories是逗号拼接的单个字符串,而非预期的分类数组。
MongoDB的$in操作符如果接收的是字符串而非数组,会仅匹配category字段完全等于该字符串的文档:
- 单选
Science时,数组['Science']转字符串结果为Science,刚好和单分类值匹配,所以查询正常 - 多选
Science和Food时,数组转字符串结果为Science,Food,没有文档的category等于该值,所以返回空数组
解决方案
你可以任选以下一种方案修复:
方案1:修改前端传参逻辑(推荐)
不要手动拼接URL查询参数,使用axios原生的params配置项,它会自动序列化数组为后端可识别的格式:
const response = await axios.get('http://localhost:8000/blog/all', { params: { categories: query // 直接传入分类数组即可,不需要手动拼接 } })
默认情况下Express服务端会自动将该格式的参数解析为数组,后端原有查询逻辑不需要修改即可正常运行。
方案2:后端兼容处理
如果不想修改前端代码,可以在后端对拿到的参数做兼容转换,将逗号分隔的字符串拆分为数组:
const cat = req.query.categories; // 统一转换为数组格式 const formatCat = Array.isArray(cat) ? cat : cat.split(','); const all = await blogModel.find({ category: { $in: formatCat } });
内容的提问来源于stack exchange,提问作者Bhavesh Damor
相关产品推荐
相关产品推荐

