动态collection.find $或NodeJS中的条件

时间:2013-12-11 17:48:31

标签: node.js mongodb node-mongodb-native

我需要从数组中传递的字符串生成$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()为

 mongo.peopleColl.find( {$or:[{name:/harry/i},{name:/potter/i}]} ).toArrarray(...

它工作正常,但在第一种情况下使用orCondition变量失败。

有关动态创建此$或条件的任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分: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
});