如何在MongoDB中使用regexp查找单词中的所有值?

时间:2016-03-28 20:44:21

标签: regex mongodb mongodb-query

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

{"name": "space delimited string"}

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

space string

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

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

由于

1 个答案:

答案 0 :(得分:2)

我认为有几种选择。

如果你的意思是" AND"对于所有字词,请使用正向前瞻:

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

$all运算符更适合您:

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

如果你的意思是"或"对于 这些单词,您可以这样做:

{ "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;