2011-12-08 5 views
3

공식 C# MongoDB 드라이버를 사용하고 있습니다.정규 표현식 쿼리에서 MongoDB 인덱스 사용

{ "firstname": 1, "surname": 1, "companyname": 1}의 인덱스가 인덱스 값과 직접 일치하는 정규식을 사용하여 컬렉션을 검색 할 수 있습니까? 누군가가 검색어로 "태양 박쥐"를 입력하면

그래서, 다음과 같이 내가 *. (.? = bbat \)를 (.? = bsun \ )를 정규식을 만들 것이며이 모든 인덱스와 일치해야합니다 firstname 또는 surname 또는 companyname이 'sun'으로 시작하고 firstname 또는 surname 또는 companyname이 'bat'으로 시작하는 항목.

내가 이런 식으로 할 수 없다면 어떻게 할 수 있습니까? 사용자는 검색어를 입력하기 만하면 각 검색어 (태양 또는 박쥐)가 어떤 요소 (이름, 성, 회사 이름)를 가리키는 지 알 수 없습니다.

답변

7

업데이트 : MongoDB 2.4 이상에서는이 방법을 사용하지 말고 대신 MongoDB's text index을 사용하십시오.

다음은 MongoDB < 2.4에 대한 원래의 여전히 관련 답변입니다.


위대한 질문입니다. 이를 염두에 두십시오 :

  1. MongoDB는 쿼리 당 하나의 인덱스 만 사용할 수 있습니다.
  2. 정규식을 사용하는 쿼리는 정규식이 루팅되고 대/소문자를 구분할 때만 인덱스를 사용합니다.

여러 필드에서 검색을 수행하는 가장 좋은 방법은 각 문서에 대한 검색어 (소문자) 배열을 만들고 그 필드를 색인하는 것입니다. 이것은 MongoDB의 멀티 키 기능을 이용합니다. 민감한 사건을 사용하는 사람이 '타일러'를 검색 할 때 db.users.ensureIndex({ "search_terms": 1 })

그런 다음, 당신이 사건을 분쇄하고 컬렉션을 검색 : 당신은 인덱스를 생성 할

{ 
    "firstname": "Tyler", 
    "surname": "Brock", 
    "companyname": "Awesome, Inc.", 
    "search_terms": [ "tyler", "brock", "awesome inc"] 
} 

: 같은

그래서 문서가 보일 수 있습니다 문자열의 시작 부분과 일치하는 정규식 :

db.users.find({ "search_terms": /^tyler/ }) 

무엇 MongoDB를이 쿼리를 실행하는 시도하고 모든 eleme에 용어와 일치하는 경우 수행 배열의 nt (인덱스도 그렇게 설정되어 있으므로 속도가 빠름). 잘하면 행운을 빌어 당신이 있어야 할 곳으로 데려다 줄 것입니다.

참고 :이 예제는 쉘에 있습니다. 나는 한 줄의 C#을 작성한 적이 없지만 구문이 다를지라도 개념은 변환됩니다.

+2

참조 [MongoDB를 - 고급 쿼리 - 정규 표현식 (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions) 및 ([MongoRegex (MongoDB를 C#을 드라이버)를 사용하는 방법] http://stackoverflow.com/a/2699945/649852). –