为什么mongoose查询时无法获取对应字符串字段的匹配结果
问题排查与修复方案
核心错误点
$in查询参数多嵌套了一层数组
代码里value本身已经是['male']数组类型,额外套一层[value]会变成[['male']]的嵌套结构,MongoDB的$in运算符需要匹配一维数组内的元素,这种结构自然匹配不到任何数据。- 潜在的JSON解析错误
你贴出的base64解码后的数据是JS对象格式,不是标准JSON:键没有双引号、字符串用单引号,这种格式直接传给JSON.parse会抛出语法错误,如果实际base64编码的就是这个结构,解析环节就已经失败,后续查询自然不会有正确结果。 - 缺少错误捕获逻辑
当前代码只处理了查询无错误的分支,如果JSON解析报错、数据库连接报错都会导致无返回,你也看不到具体的错误原因。
修正后的代码
app.get("/getresult", async (req, res) => { try { const b64string = req.query.filters; const buf = Buffer.from(b64string, 'base64'); // 如果base64包含中文等非ASCII字符,用utf-8解码更稳妥 const jsonStr = buf.toString('utf8'); const parseData = JSON.parse(jsonStr); const field = parseData.List2[1].labelName; const values = parseData.List2[1].values; // 去掉多余的数组嵌套,直接传入values数组即可 const result = await user_profiles.find({ [field]: { $in: values } }); res.send(result); } catch (err) { console.error('请求异常:', err); res.status(500).send({ error: err.message }); } });
额外注意事项
- 确保base64编码的是标准JSON格式:键必须用双引号,字符串值也必须用双引号,不能用单引号,也不能保留尾逗号。
- 后续如果要匹配Location字段,MongoDB查询默认区分大小写,你示例数据里有小写的
america,而values里是大写的America,会匹配不上,需要做大小写不敏感查询或者统一入库时的大小写格式。
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

