在机车应用程序中,在查询我的模型的搜索引擎中(由于通常原因,我赢得了相当具体的元数据)我需要包含一个正则表达式引擎来检查关键字字段。
我的方法如下:
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,以便我可以将它传递给视图,如果我需要的话)。
但是,我并不匹配我知道可以在集合中的文档中使用的数据
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上以逗号分隔的关键字列表搜索的正确语法。
答案 0 :(得分:2)
您的方法存在一些问题:
query
是一个Mongoose Query
对象,您可以将参数的顺序换成regex
方法,因为路径首先出现,然后是正则表达式值。< / LI>
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"));
}