一尘不染

用于Number类型字段的Mongoose find()RegExp

node.js

我试图用过滤器创建一个表,当我需要通过正则表达式查找行时,我在下面出现了错误。我如何将RegExp与Number的字段类型一起使用?更改String的字段类型,这是个好主意吗?

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);
});

在路径“数字”处将值“ / 555 /”转换为数字失败


阅读 438

收藏
2020-07-07

共1个答案

一尘不染

当然,正则表达式仅适用于字符串。但是,您仍然可以这样做,尽管这样做效率非常低:

Contract.find(
    { "$where": "function() { return this.number.toString().match(/555/) != null; }" }
).function(err,contracts) {
   // do something with results
});

MongoDB
$where
查询运算符允许在服务器上针对集合中的每个文档或其他查询条件遗留的文档评估JavaScript条件。

基本上,该评估将字段值转换为a String,然后对其进行正则表达式操作。

否则,您将更改内容或为字符串表示形式添加另一个字段。但是,除非您^从字符串的开头使用锚,否则即使$regex对实际的字符串字段进行操作也比使用所示的JavaScript评估更有效。

PS确保您的服务器允许JavaScript评估。有些人选择关闭此功能。但默认情况下应启用。

2020-07-07