我试图从用户搜索的内容中产生查询.我有一个字符串数组,我只想在mongoDB选择器中发送,我的问题是使用/ text/syntax,它可以从mongoDB控制台完美地运行,如下所示:
Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] });
Run Code Online (Sandbox Code Playgroud)
但我无法设法在javascript中编写相同的语法,我已经尝试了几个版本.
var mongoDbArr = [];
searchArray.forEach(function(text) {
mongoDbArr.push({name: /text/});
mongoDbArr.push({tags: /text/});
});
return Items.find({ $or: mongoDbArr});
Run Code Online (Sandbox Code Playgroud)
但它只搜索"文本"而不是变量中的什么.像这样:
var mongoDbArr = [];
searchArray.forEach(function(text) {
mongoDbArr.push({name: "/" + text + "/"});
mongoDbArr.push({tags: "/" + text + "/"});
});
return Items.find({ $or: mongoDbArr});
Run Code Online (Sandbox Code Playgroud)
但这并没有给我任何结果.我错过了什么?
Aks*_*hat 18
你必须使用javascript构建正则表达式:
var mongoDbArr = [];
searchArray.forEach(function(text) {
mongoDbArr.push({name: new RegExp(text)});
mongoDbArr.push({tags: new RegExp(text,"i")});
});
return Items.find({ $or: mongoDbArr});
Run Code Online (Sandbox Code Playgroud)
或者使用mongodb 的正则表达式查询:
mongoDbArr.push({name: { $regex : text, $options:"i" } });
mongoDbArr.push({tags: { $regex : text, $options:"i" } });
Run Code Online (Sandbox Code Playgroud)
要转义特殊字符,您可以在使用之前执行此操作text(来自JQuery UI的源代码)
text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
Run Code Online (Sandbox Code Playgroud)
在服务器的发布函数中尝试这个:
return YourCollection.find({'$or' : [
{ 'field1':{'$regex':searchString} },
{ 'field2':{'$regex':searchString} },
{ 'field3':{'$regex':searchString} }, ]
});
Run Code Online (Sandbox Code Playgroud)