【发布时间】:2015-03-28 01:03:46
【问题描述】:
我正在查看这个问题How to build a conditional query in Mongoose? 并尝试通过处理查询字符串中的整数来构建它。
我有以下代码。
var conditions = {};
var patt = new RegExp('^[0-9]');
for (var key in req.query) {
if (req.query.hasOwnProperty(key)) {
if(patt.test(req.query[key])) {
conditions[key] = new RegExp('^' + parseInt(req.query[key]) + '$', 'i');
}
else {
conditions[key] = new RegExp('^' + req.query[key] + '$', 'i');
}
}
}
当我执行&color=red 时,这将返回等于红色的颜色。
但是当我做&version=2 等时,我什么也没得到。
我在 if 语句中放置了一个控制台日志,以确认 patt 正则表达式正在获取以 int 开头的值,但这似乎确实按我的预期执行(返回版本 = 2 的结果) .
如果我要如下重构我的代码,这确实可以部分工作。然而,这个解决方案并不是真正可维护的,因为我需要为每个潜在的参数添加一个条件,并且需要返回并在更多可用时进行修改。
var version = parseInt(req.query.version);
var query = Model.find();
if (version) {
query = query.where('version').equals(version);
}
上述 sn-p 的另一个问题是,如果我正在寻找一个字符串,例如标题,而标题以数字开头,例如 7up,那么这也不会返回任何结果。
var title= req.query.title;
var query = Model.find();
if (version) {
query = query.where('title').equals(title);
}
是否有我可以在这里使用的解决方案,允许我在请求中使用任何参数,如果它与我的 patt 正则表达式匹配,则将其视为整数?
下面是我的数据模型的一个 sn-p,一旦我能得到这个工作,我打算添加更多项目,numbers 或 strings
var ModelSchema = new Schema({
version: {
type: Number,
trim: true
},
color: {
type: String,
trim: true
},
title: {
type: String,
trim: true
},
});
mongoose.model('Model', ModelSchema);
【问题讨论】:
-
能否请您展示一下您的猫鼬模型。
-
@NarendraSoni 我已经更新了这个问题,你的问题让我在最后做了一些测试,如果字符串以 int 开头,例如 7up,我也发现了另一个问题。你有什么想法吗?
-
如果我遵循您的代码,您似乎正在尝试使用正则表达式来搜索查询中的整数,这对我来说没有意义。你有
conditions[key] = new RegExp('^' + parseInt(req.query[key]) + '$', 'i');,但你应该可以简单地拥有conditions[key] = parseInt(req.query[key]); -
@BrianShamblen 你应该把它放在一个答案中,这样我就可以接受它,因为它似乎有效,谢谢,如果你对是否可以处理以开头的字符串有任何想法,我也会感兴趣一个数字?
-
如果您将正则表达式更改为 '^[0-9]$',它应该只匹配包含数字的字符串。
标签: javascript mongoose