在我看来,有几个选择。
如果您的意思是 所有 单词的“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;