Mongoose.js和Regexp的查询对象

时间:2014-07-11 02:32:45

标签: javascript regex node.js mongodb mongoose

在机车应用程序中,在查询我的模型的搜索引擎中(由于通常原因,我赢得了相当具体的元数据)我需要包含一个正则表达式引擎来检查关键字字段。

我的方法如下:

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上以逗号分隔的关键字列表搜索的正确语法。

1 个答案:

答案 0 :(得分:2)

您的方法存在一些问题:

  1. 假设query是一个Mongoose Query对象,您可以将参数的顺序换成regex方法,因为路径首先出现,然后是正则表达式值。< / LI>
  2. 您需要使用RegExp构造函数构造正则表达式,因为/字符的文字表示法不能从字符串动态构造。
  3. 在这样的循环中调用query.regex不会将条件组合在一起,因为每次调用只会覆盖前一个调用。相反,您可以使用|将关键字加入到与其中任何一个匹配的组合正则表达式中。
  4. 将它们放在一起它应该是这样的:

    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"));
    }
    
相关问题