2014-10-29 3 views
17

필드가 값으로 시작하는 문서를 찾으려고합니다.MongoDB "starts with"인덱스 된 하위 문서에 대한 쿼리를 수행 할 수 있습니까?

테이블 스캔은 notablescan을 사용하여 비활성화됩니다.

이 작동 :

db.articles.find({"url" : { $regex : /^http/ }}) 

이되지 않습니다

db.articles.find({"source.homeUrl" : { $regex : /^http/ }}) 

내가 오류를 얻을 :

error: { "$err" : "table scans not allowed:moreover.articles", "code" : 10111 } 

인덱스가 모두 urlsource.homeUrl에 있습니다

{ 
    "v" : 1, 
    "key" : { 
     "url" : 1 
    }, 
    "ns" : "mydb.articles", 
    "name" : "url_1" 
} 

{ 
    "v" : 1, 
    "key" : { 
     "source.homeUrl" : 1 
    }, 
    "ns" : "mydb.articles", 
    "name" : "source.homeUrl_1", 
    "background" : true 
} 

subdocument 인덱스에 대한 정규식 쿼리에 제한이 있습니까?

+1

작동해야합니까? 설명을 할 때 어떤 일이 발생합니까? db를 허용하는 스캔을 실행하려고 했습니까? (설명과 함께) –

+0

나는 설명을 해보려고했지만 너무 오랫동안 그것을 죽여야했다. 테이블 스캔을 사용 가능하게하면 조회는 모두 예상 된 결과를 리턴합니다. – tjrobinson

답변

19

테이블 검색을 사용하지 않도록 설정하면 쿼리 최적화 프로그램에서 테이블 검색이 "성공"하는 쿼리가 실행되지 않습니다. 설명을 게시하지 않았지만 오류를 기반으로 여기에서 일어나는 일을 가정하는 것이 타당합니다. 색인을 명시 적으로 암시 해보십시오.

db.articles.find({"source.homeUrl" : { $regex : /^http/ }}).hint({"source.homeUrl" : 1}) 

이 경우 테이블 검색이 가능한 선택 사항으로 제거되고 쿼리가 성공적으로 반환되어야합니다.

+0

오류 : { "$ err": "나쁜 힌트", "코드": 10113} – tjrobinson

+0

존재하지 않는 색인을 지정하면 오류가 발생합니다. 이는 아직 완성되지 않았거나 (배경 참고 : true) 누락 된 것이거나 오타가있을 수 있음을 나타냅니다. –

+0

좋은 지적이지만 인덱스가 작성을 마친 후에도 여전히 동일한 오류가 발생합니다. 더욱 이상하게도, 예를 들어, 하위 인덱스가 아닌 인덱스의 이름을 지정하면 url, 결과가 돌아 왔지만 정규 표현식을 사용하지 않았습니다! 힌트 ({ "url": 1}) – tjrobinson