我尝试创建一个带有过滤器的表,当我需要通过正则表达式找到行时,我在下面有错误。我如何使用RegExp与字段类型的数字?改变字段类型的字符串,是一个好主意吗?
var ContractSchema = new Schema({
userId: {type: Schema.Types.ObjectId, ref: 'User'},
number: Number,
// ...
});
module.exports = mongoose.model('Contract', ContractSchema);
Contract.find({number: /555/}, function(err, contracts){
console.log(err, contracts);
});
在路径"number"处,值"/555/"转换为number失败
当然,正则表达式只适用于字符串。然而,您仍然可以这样做,尽管这样做的效率非常低:
Contract.find(
{ "$where": "function() { return this.number.toString().match(/555/) != null; }" }
).function(err,contracts) {
// do something with results
});
MongoDB $where
查询操作符允许在服务器上为集合中的每个文档或其他查询条件留下的文档评估JavaScript条件。
基本上,求值将字段值转换为String
,然后允许对其进行regex操作。
否则,您将更改内容或为字符串表示添加另一个字段。但是,除非您从字符串的开始使用锚^
,否则即使在实际字符串字段上使用$regex
操作也不会比使用JavaScript计算更有效,如所示。
p。确保你的服务器允许JavaScript计算。有些人选择关闭它。但是它应该是默认打开的
如果你不能使用$where
(即如果你使用mongoose-paginate-v2
),那么用$expr
代替$where
:
const fieldName = 'number'
const regExp = new RegExp(555);
const query = {
$expr: {
$regexMatch: {
input: { $toString: `$${fieldName}` },
regex: regExp,
},
};
Contract.find(query);
将number
转换为每个文档的字符串类型,然后您可以正确有效地使用正则表达式,或者只是放弃使用RegEx,并使用内置的Mongo过滤选项。
例如,查找具有特定值的数字:
{number: 555}
或者查找(500,600)范围内的数字:
{number: {$gt: 500, $lt: 600}}
下面是一些常用查询操作符的列表。
这两种方法都比在查询时将每个Number
转换为String
更有效。