我需要从数组中传递的字符串生成$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
变量失败。
有关动态创建此$或条件的任何帮助都会很棒。谢谢!
答案 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
});