2013-12-11 29 views
0

我需要从数组中传递的字符串生成一个$or过滤器,以从20K文档集合中选择文档。

所以我写了下面的函数产生的$or条件:

function orConditionCreator(attName, tagsArray) 
{ 
    var myarray = []; 
    var myJSON = ""; 
    for (var i = 0; i < tagsArray.length; i++) { 
     var key = attName; 
     var json = { }; 
     // forming regex with case insensitivity 
     json[key] = "/" + tagsArray[i] + "/i";  
     myarray.push(json); 
    } 

    myJSON = JSON.stringify({ $or: myarray }); 
    // myJSON contains quotes like in { "name" : "/HarryPotter/i" } 
    // this is not desirable for regex. So we strip the quotes 
    myJSON = myJSON.replace(/\"/g, ""); 
    return myJSON; 
} 

然后我把它像:

//tags[0] = "harry" , tags[1] = "potter" 
var orCondition = orConditionCreator("name", tags); 
mongo.peopleColl.find(orCondition).toArray(function(err, documents) { 
    if(err) { /* handle */ } 
    // do stuff with documents 
}); 

这里,如预期find(orCondition)不工作。现在,如果我手动传递)由orConditionCreator回到collection.find(字符串作为

​​

它工作正常,但与使用orCondition变量的第一例失败。

任何关于动态创建这个$或条件的帮助都很好。谢谢!

+0

您可以编辑您的文章,以包括'orConditionCreator'的代码?这可能不会返回您认为的结果。另外,在这里使用'$ in'而不是'$或'会更有效率。 – JohnnyHK

+0

你能提供错误信息吗?你必须有另一个错误,错字... etc – damphat

+0

@JohnnyHK:我已经回滚了原来的帖子,以包含'orConditionCreator'。请检查一下。正如名字是像“哈利波特”这样的单个字符串,那么$在仍然有效? – Haywire

回答

1

这个原因这不是返回任何文档,是orConditionCreator返回一个JSON字符串,而不是一个对象。

但是就像我在评论中提到的,你应该使用$in此相反:

//tags[0] = "harry" , tags[1] = "potter" 
var regexps = tags.map(function(tag) { 
    // When building regular expressions from strings, use the constructor. 
    return new RegExp(tag, "i"); 
}); 
mongo.peopleColl.find({name: {$in: regexps}}).toArray(function(err, documents) { 
    if(err) { /* handle */ } 
    // do stuff with documents 
}); 
+0

谢谢@JohnnyHK! RegExp中有一个错误,请修复它。它像一个魅力一样工作!我会接受这个答案。不过,我很想知道是否有办法让'onConditionCreator'返回的字符串工作(也许将其转换为某种类型的字符串)? – Haywire

+0

@haywire错字固定 - 谢谢你让我知道。您可以通过调用JSON.parse(str)'将JSON字符串转换为对象。 – JohnnyHK