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

NodeJS搭配Mongoose使用MongoDB的$操作符查询记录无返回如何解决?

问题根因

你的rating字段在Mongoose Schema中定义为Number数值类型,但执行查询时给$lte操作符传入的是字符串类型的"5"。MongoDB的比较操作符是类型敏感的,不会自动对不同类型的数值做隐式转换,数值类型的字段和字符串类型的比较值匹配时永远返回false,因此没有结果返回。

排查步骤
  • 核对查询条件的取值类型和Schema定义的字段类型是否一致,可通过typeof操作符打印查询值的类型,和字段定义做对比快速定位类型不匹配问题
  • 开启Mongoose调试日志,在初始化Mongoose的代码中添加mongoose.set('debug', true),可直接打印发送到MongoDB的原生查询语句,确认查询参数的类型是否符合预期
  • 直接在MongoDB Shell中分别执行db.products.find({rating:{$lte:"5"}})和db.products.find({rating:{$lte:5}}),对比两次的返回结果即可验证问题原因
解决方案

将查询条件中的字符串"5"改为数值类型的5即可,修改后的控制器代码如下:

const Product = require("../models/product.model");

exports.getProducts = async (req, res) => {
  // 将字符串"5"替换为数值类型的5
  const products = await Product.find({ rating: { $lte: 5 } });

  console.log(`products: ${products}`);

  res.json({
    products: products,
  });
};

如果你的查询值来自请求参数(比如req.query.rating、req.params.rating),需要提前通过Number()方法将参数转为数值类型后再传入查询条件,避免再次出现类型不匹配问题。

内容的提问来源于stack exchange,提问作者Hindie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:07