如何在Node.js和Mongoose中实现字段等于、不等于及存在性查询
解决方案
你当前的接口直接把请求查询参数透传给Mongoose的find方法,仅支持等值查询,要实现你要求的三类查询,只需基于MongoDB原生查询操作符对查询条件做转换即可,以下是修改后的代码和调用方式:
修改后的接口代码
recordRouter .route("/templates") .get((req, res, next) => { // 构造安全查询条件,避免NoSQL注入风险 const query = {}; // 处理「字段存在」查询 if (req.query.has_exists) { query[req.query.has_exists] = { $exists: true }; } // 处理「字段非空」查询 if (req.query.non_empty) { query[req.query.non_empty] = { $ne: "", $ne: null }; } // 处理「字段不等于某个值」查询,默认不区分大小写 if (req.query.description_ne) { query.description = { $regex: new RegExp(`^(?!${req.query.description_ne}$)`, "i") }; // 若需要区分大小写,替换为下方代码: // query.description = { $ne: req.query.description_ne } } // 保留原有普通等值查询能力 Object.keys(req.query).forEach(key => { if (!['has_exists', 'non_empty', 'description_ne'].includes(key)) { query[key] = req.query[key]; } }) Templates.find(query) .then( (record) => { res.statusCode = 200; res.setHeader("Content-Type", "application/json"); res.json(record); }, (err) => res.status(400).json(err) ) .catch((err) => res.status(400).json(err)); }) .post((req, res, next) => { Templates.create(req.body) .then( (record) => { res.statusCode = 200; res.setHeader("Content-Type", "application/json"); res.json(record); }, (err) => res.status(400).json(err) ) .catch((err) => res.status(400).json(err)); })
三类需求的调用方式
- 查询所有包含uuid字段的记录:发起GET请求调用
/templates?has_exists=uuid - 查询所有title不为空的记录:发起GET请求调用
/templates?non_empty=title - 查询所有title等于"Test Message"且description不等于"bad"的记录:发起GET请求调用
/templates?title=Test Message&description_ne=bad
用你提供的示例数据测试,第三个查询会自动过滤掉第二条description为BAD的记录,仅返回第一条符合要求的结果。
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

