还没有Node / Mongoose的经验。
给出这样的浏览器查询:
www.example.com/systems?properties.max_diameter=24
并且Mongoose架构是:
var SystemSchema = new Schema({
....
properties: {
max_diameter: { type: Number, required: true}
}
});
module.exports = mongoose.model('System', SystemSchema);
使用console.log(req.query),我知道Node控制器看到了:
req.query = { 'properties.max_diameter': '24' }
注意该值是单引号。
因此,此查询失败:
System.find(req.query).sort(sort_param).find(function(err, systems) {
res.send(systems);
});
但是如果我对这个值进行硬编码以便我有这个:
System.find({'properties.max_diameter': 24}).sort(sort_param).find(function(err, systems) {
res.send(systems);
});
完美无缺。
当然,删除引号很容易,但我不可能知道将使用的各种查询组合。我以为Mongoose会以某种方式解决这个问题,但我无法弄清楚我错过了什么或做错了什么。
提前感谢您的帮助。
干杯。
答案 0 :(得分:0)
我相信你知道,请求是作为HTTP请求正文中的字符串而来的。这意味着您需要在提交到Mongoose之前将数字的字符串表示形式转换为数字对象。我可以理解为什么你会觉得Mongoose会自动执行此操作,但我可以想到几个需要相反效果的用例。虽然大多数项目都使用Mongoose和HTTP服务器,但您可以使用Mongoose编写许多其他类型的应用程序。
要解决此问题,只需在路线中使用parseInt()
转换为数字对象,然后再使用req.query
对象进行搜索。
req.body.max_diameter = parseInt(req.max_diameter);
System.find(req.query).sort(sort_param).find(function(err, systems) {
res.send(systems);
});
您还可以设置中间件功能来全局处理此问题。