在机车应用程序中,在查询我的模型的搜索引擎中(由于通常的原因,我不会在此处讨论相当具体的元数据),我需要包含一个正则表达式引擎来检查关键字字段。
我的方法如下:
this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
console.log(this.keywords);
if(strings.exists(this.keywords)) {
keywords = this.keywords.split(", ");
var len = keywords.length - 1;
do {
query.regex("/" + this.keywords[len] + "/ig", "keywords");
} while(len--);
}
(这是 this.keywords,以便我可以在需要时将其传递给 View )。
但是,我没有匹配我知道集合中文档中可用的数据
strings.makesafe
调用只是执行以下操作:
strings.makeSafe = function(str) {
str = String(str);
var re = /\$/gi;
str = str.replace(re, "U+FF04");
re = /\./gi;
return str.replace(re, "U+FF08");
};
并且是尝试解决 mongoose 通过“.”进行代码注入(inject)的漏洞。和“$”字符。它已经过测试,应该不会导致问题。
我现在认为这与正则表达式的结构或调用方法有关。这是在 mongoose 中完成对逗号分隔关键字列表的搜索的正确语法吗?
最佳答案
您的方法存在一些问题:
- 假设
query
是 MongooseQuery
对象,您已将参数的顺序交换为regex
方法,因为路径首先出现,然后是正则表达式值。 - 您需要使用
RegExp
构建正则表达式构造函数作为带有/
字符的文字表示法不能从字符串动态构造。 - 在这样的循环中调用
query.regex
不会将条件或条件组合在一起,因为每次调用都会覆盖前一个调用。相反,您可以使用|
将关键字连接到一个组合的正则表达式中,以匹配它们中的任何一个。
把它们放在一起应该是这样的:
this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
console.log(this.keywords);
if (strings.exists(this.keywords)) {
keywords = this.keywords.split(", ");
query.regex("keywords", new RegExp(keywords.join("|"), "i"));
}
关于javascript - Mongoose.js 和使用 Regexp 的查询对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24689245/