簡體   English   中英

動態收集。在NodeJS中找到$ or條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM