如何在Mongoose的model.find方法中用查询参数设置对象键?
解决Mongoose动态查询键的问题
我来帮你搞定这个问题!你遇到的核心问题是JavaScript对象字面量的键名解析规则——直接用变量作为键名时,不能用普通的字面量写法,得用计算属性名或者先构建查询对象再动态赋值。
先分析你两种写法的问题:
- 第一种写法
mongoose.model.find({ req.query.type : req.params.tid}):在对象字面量里,req.query.type会被当成字符串键名,而不是取它的实际值(比如如果req.query.type是"category",这里的键会是"req.query.type"而不是"category"),所以查询完全不对。 - 第二种写法
let type = req.query.type; mongoose.model.find({type : req.params.tid}):这里的type同样会被解析成字符串键名"type",而不是变量type的值,相当于你在查{ "type": "xxx" },不是你想要的动态字段。
正确的两种写法
方法1:ES6计算属性名(推荐)
ES6支持在对象字面量里用方括号包裹表达式作为键名,这样就能直接使用变量的值作为查询键:
// 直接写在find方法里 mongoose.model.find({ [req.query.type]: req.params.tid }); // 或者先定义查询对象,更清晰 const queryKey = req.query.type; const query = { [queryKey]: req.params.tid }; mongoose.model.find(query);
方法2:先创建对象再动态赋值(兼容ES5)
如果你的环境不支持ES6,或者更习惯这种写法,可以先初始化空对象,再通过方括号语法赋值:
const query = {}; const key = req.query.type; // 动态设置键值对 query[key] = req.params.tid; mongoose.model.find(query);
额外提示
为了避免意外的查询错误或者安全问题,建议先验证req.query.type是否是你的Model中存在的字段,比如:
const allowedFields = ["category", "tag", "author"]; // 允许的查询字段 const queryKey = req.query.type; if (!allowedFields.includes(queryKey)) { // 处理非法字段的情况,比如返回错误 return res.status(400).send("Invalid query field"); } const query = { [queryKey]: req.params.tid }; mongoose.model.find(query);
内容的提问来源于stack exchange,提问作者Talha nousher
相关产品推荐
相关产品推荐

