假设我在MongoDB文档中有以下字符串:
{"name": "space delimited string"}
我需要使用regexp
构建mongodb查询,以通过输入以下搜索请求来查找此文档:
space string
它看起来像RDBS中的LIKE
运算符。我知道最新的MongoDB 3有全文搜索,但我需要regexp
当前过时的版本。
请帮助我使用regexp
构建mongodb查询,以便通过输入上面的搜索来查找文档。
由于
答案 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;