2013-12-11 2 views
0

배열에서 전달 된 문자열의 $or 필터를 생성하여 20K 문서 컬렉션의 문서를 선택해야합니다.

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; 
} 

그럼 내가 같이 호출 :

그래서 나는 $or 조건을 생성하는 다음과 같은 기능을 썼다 예상대로 여기

//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)가 작동하지 않습니다. 지금, 나는 수동으로

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

가 잘 작동하지만 orCondition 변수의 사용과 첫 번째 경우에 실패로 (collection.find하는 orConditionCreator에 의해 반환 된 문자열)를 전달하는 경우.

이 $ 또는 조건의 동적 생성에 대한 도움이 될 것입니다. 감사!

+0

당신이 당신의 게시물을 수정할 수'orConditionCreator'에 대한 코드를 포함? 그것은 당신이 생각하는 것을 반환하지 않을 가능성이 있습니다. 또한'$ or' 대신에'$ in'을 사용하면 훨씬 더 효율적입니다. – JohnnyHK

+0

오류 메시지를 제공 할 수 있습니까? – damphat

+0

@JohnnyHK : 원본 게시물을 'orConditionCreator'를 포함하도록 롤백했습니다. 그것을 확인하십시오. 그리고 이름이 'Harry Potter'와 같은 단일 문자열이기 때문에 $가 여전히 작동합니까? – 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

감사합니다. @ JohnnHK! 'RegExp'에 오자가 있습니다. 고쳐주십시오. 그것은 매력처럼 일했습니다! 나는 이것을 대답으로 받아 들일 것이다. 아직도'onConditionCreator'에 의해 반환 된 문자열을 만드는 방법이 있는지 궁금합니다. (어쩌면 그것을 일종의 문자열로 변환합니다)? – Haywire

+0

@haywire 오타가 수정되었습니다. 알려 주셔서 고마워요. 'JSON.parse (str)'호출을 통해 JSON 문자열을 객체로 변환 할 수 있습니다. – JohnnyHK