【问题标题】:How to find all values in word by using regexp in MongoDB?如何在 MongoDB 中使用正则表达式查找 word 中的所有值?
【发布时间】:2016-03-28 20:44:20
【问题描述】:

假设我在 MongoDB 文档中有以下字符串:

{"name": "space delimited string"}

我需要使用 regexp 构建 mongodb 查询,以通过输入以下搜索请求来查找此文档:

space string

它看起来像 RDBS 中的 LIKE 运算符。我知道有最新的 MongoDB 3 全文搜索,但由于当前版本过时,我需要 regexp

请帮我用regexp构造mongodb查询,通过输入上面的搜索来查找文档。

谢谢

【问题讨论】:

    标签: regex mongodb mongodb-query


    【解决方案1】:

    在我看来,有几个选择。

    如果您的意思是 所有 单词的“AND”,则使用正向前瞻:

    { "name": /(?=.*\bspace\b)(?=.*\bstring\b).+/ }
    

    或者如果$all 运算符更适合您:

    { "name": { "$all": [/\bspace\b/,/\bstrig\b/] } }
    

    如果您对任何一个的单词表示“OR”,那么您可以这样做:

    { "name": /\bspace\b|\bstring\b/ }
    

    或使用$in 运算符:

    { "name": { "$in": [/\bspace\b/,/\bstring\b/] } }
    

    请注意,在所有情况下,您都可能希望其中的 \b 边界匹配来分隔“单词”,否则您会得到“部分”单词。

    所以这取决于您的意思以及最适合您的情况。您可以使用其自己的语法构造正则表达式来表示“AND”或“OR”,或者您可以使用等效的 MongoDB 逻辑表达式($all$in)来获取正则表达式的“列表”而是。

    所以为正则表达式构建一个字符串或构建一个列表。您的选择。


    当然,您需要将字符串“分解”为“单词”才能进行处理。这里缺少一个语言标签,但作为一个 JavaScript 示例:

    作为“AND”的单个正则表达式

    var searchString = "space string";
    
    var expression = new RegExp(
        "" + searchString.split(" ").map(function(word) {
            return "(?=.*\\b" + word + "\\b)"
        }).join("") + ".+"
    )
    
    var query = { "name": expression };
    

    或者对于单个表达式的“OR”条件

    var expression = new RegExp(
        searchString.split(" ").map(function(word) {
            return "\\b" + word + "\\b"
        }).join("|")
    );
    
    var query = { "name": expression };
    

    或作为表达式列表:

    var type = "AND",
        query = { "name": {} };
    
    // List of expressions
    var list = searchString.split(" ").map(function(word) {
        return new RegExp("\\b" + word + "\\b")
    });
    
    // Determine operator based on type
    query.name[( type === "AND") ? "$all" : "$in"] = list;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多