8

我试图从用户搜索的内容中生成查询。我有一个字符串数组,我只想在 mongoDB 选择器中发送,我的问题是 /text/ 语法,它可以从 mongoDB 控制台完美运行,如下所示:

Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] });

但我无法设法在 javascript 中编写相同的语法,我尝试了几个版本。

var mongoDbArr = [];
  searchArray.forEach(function(text) {
    mongoDbArr.push({name: /text/});
    mongoDbArr.push({tags: /text/});
  });
  return Items.find({ $or: mongoDbArr});

但它只搜索“文本”而不​​是变量中的内容。像这样:

var mongoDbArr = [];
  searchArray.forEach(function(text) {
    mongoDbArr.push({name: "/" + text + "/"});
    mongoDbArr.push({tags: "/" + text + "/"});
  });
  return Items.find({ $or: mongoDbArr});

但这并没有给我任何结果。我错过了什么?

4

2 回答 2

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});

或者使用mongodb的正则表达式查询:

mongoDbArr.push({name: { $regex : text, $options:"i" } });
mongoDbArr.push({tags: { $regex : text, $options:"i" } });

要转义特殊字符,您可以在使用之前执行此操作text(来自 JQuery UI 的源代码)

text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
于 2013-04-15T20:13:07.973 回答
5

在服务器的发布功能中试试这个:

return YourCollection.find({'$or' : [ 
  { 'field1':{'$regex':searchString} },
  { 'field2':{'$regex':searchString} },
  { 'field3':{'$regex':searchString} }, ]
});
于 2013-04-15T19:05:33.543 回答