2013-04-15 7 views
8

사용자가 검색 한 내용으로 쿼리를 생성하려고합니다.Meteor & mongoDB LIKE 쿼리

Items.find({ $or: [{name: /doc/}, {tags: /doc/}, {name: /test/}, {tags: /test/}] }); 

하지만 난에 관리 할 수 ​​없습니다 : 나는 그냥 MongoDB의 선택에 통해 보낼 문자열 배열을 가지고, 내 문제는이 같은 MongoDB를 콘솔에서 완벽하게 작동,은/텍스트/구문이다 자바 스크립트에서 동일한 구문을 작성, 나는 여러 버전을 시도했습니다.

var mongoDbArr = []; 
    searchArray.forEach(function(text) { 
    mongoDbArr.push({name: /text/}); 
    mongoDbArr.push({tags: /text/}); 
    }); 
    return Items.find({ $or: mongoDbArr}); 

그러나 변수에서 whats가 아닌 "text"만 검색합니다. 그리고 다음과 같이 :

그러나 결과가 나에게 돌아 오지는 않습니다. 나는 무엇을 놓치고 있습니까?

+0

서버에서 mongodb를 사용 하시겠습니까? 아니면 클라이언트에서 minimongo를 사용합니까? (또는 둘 다?) – mquandalle

+0

지금, 둘 다. 메신저 기본 설정으로 앱을 사용하고 있습니다. – Snidd

답변

18

을 당신은 자바 스크립트를 사용하여 정규 표현식을 구축해야 :

var mongoDbArr = []; 
searchArray.forEach(function(text) { 
    mongoDbArr.push({name: new RegExp(text)}); 
    mongoDbArr.push({tags: new RegExp(text,"i")}); 
}); 

return Items.find({ $or: mongoDbArr}); 

또는 MongoDB를 가진 regular expressions 쿼리를 사용 :

mongoDbArr.push({name: { $regex : text, $options:"i" } }); 
mongoDbArr.push({tags: { $regex : text, $options:"i" } }); 

특수 문자를 이스케이프 처리하려면 먼저을 사용하십시오(JQuery UI 소스에서 제공)

text = text.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 
+0

정규 표현식이 현재 작동했습니다. 사용자가 정규식에서 다른 것을 의미하는 예약 문자를 입력하면 어떻게 될지 걱정됩니다. – Snidd

+0

Ive는 특수 문자를 이스케이프 처리하도록 답변을 수정했습니다. – Akshat

+0

우와. 이 두 정규식 쿼리는 클라이언트 측에서 작동합니까? 와우. 네, 그렇습니다. 마음을 날려. 이것을 새로운 [Meteor autocompletion] (https://github.com/mizzao/meteor-autocomplete) 패키지에 넣으십시오 ... –

5

서버에 게시 기능이 시도 :

return YourCollection.find({'$or' : [ 
    { 'field1':{'$regex':searchString} }, 
    { 'field2':{'$regex':searchString} }, 
    { 'field3':{'$regex':searchString} }, ] 
}); 
+0

이것은 나를 위해 일했다. 감사! –