You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:45:04