【问题标题】:Mongoose.js and the query object with RegexpMongoose.js 和带有正则表达式的查询对象
【发布时间】:2014-07-11 02:32:44
【问题描述】:

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

我的做法如下:

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 的代码注入漏洞。和“$”字符。它已经过测试,不应成为问题的根源。

我现在认为这与正则表达式或调用方法的结构有关。这是在 mongoose 中搜索逗号分隔的关键字列表的正确语法吗?

【问题讨论】:

    标签: javascript regex node.js mongodb mongoose


    【解决方案1】:

    您的方法存在一些问题:

    1. 假设 query 是 Mongoose Query 对象,您已将参数的顺序交换到 regex 方法,因为路径先出现,然后是正则表达式值。
    2. 您需要使用RegExp 构造函数作为文字符号来构造正则表达式,而/ 字符不能从字符串动态构造。
    3. 在这样的循环中调用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"));
    }
    

    【讨论】:

    • 这看起来真的很好,是对差距的一个很好的解释。我还没有机会测试,但我会尽快奖励积分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多