[英]Dynamic collection.find $or condition in NodeJS
我需要從數組中的傳遞字符串生成$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
返回的字符串orConditionCreator
給collection.find()
mongo.peopleColl.find( {$or:[{name:/harry/i},{name:/potter/i}]} ).toArrarray(...
它工作正常,但在使用orCondition
變量的第一種情況下失敗。
關於動態創建此$ or條件的任何幫助將非常有用。 謝謝!
不返回任何文檔的原因是, 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
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.