Meteor从参数传递MongoDB选择器

时间:2014-04-29 10:44:17

标签: javascript mongodb meteor

我想从一个好的旧学校rdbms那里得到一些与LIKE相同的查询,所以我必须使用某种正则表达式。

当我尝试这个时,它工作正常

Countdowns.find({"name":{ "$regex": /ANW/ }},{ sort: {regDate: -1 }});

该值正确返回。但是,当我构建mongoDb选择器(该函数的第一个JSON参数)时,它永远不会起作用。

var key = Session.get('searchKey');
var field = Session.get('searchField');
var temp = '{"'+ field +'":{ "$regex": /'+key+'/ }}';

var selector = JSON.parse(JSON.stringify(temp));
Countdowns.find(selector,{ sort: {regDate: -1 }});

当我测试它时(在JSON.parse期间使用try-catch),JSON对象是在没有任何错误的情况下构建的,但是当我将它作为变量传递时,函数(find())无法运行。

还有其他方法可以构建选择器吗?

1 个答案:

答案 0 :(得分:0)

我已经在控制台上测试了,这就是我得到的。

The selector is a string, you need a RegExp

尝试这样做

  var key = Session.get('key'), field = Session.get('field');
  var selector = {}; 
      selector[field] = { $regex : new RegExp(key) };

有了这个,你将得到:

With new RegExp('string')

这对于minimongo来说应该是可以接受的。


为什么JSON.parse不起作用?在你通过temp的地方,这就是它的样子:

string of a string

在将其传递给JSON.stringify之前,您已经有了一个字符串。可是等等!你会说,如果我把它传递给JSON.parse它会起作用吗?让我们看看:

the forward slash is not well formatted

不。正斜杠必须格式正确,即使这样你也会得到$regex的字符串,你需要一个RegExp object

even if formatted you get a string that looks like a RegExp

所以我们之前写过的就是这样做的结果。首先,定义将数据库选择器作为对象保存的变量,然后构造selector