2014-10-29 17 views
17

Próbuję znaleźć dokumenty, w których pole zaczyna się od wartości.Czy mogę wykonać zapytanie MongoDB "zaczyna się od" w indeksowanym polu poddokumentów?

Skanowanie tabeli wyłącza się przy użyciu notablescan.

to działa:

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

To nie:

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

pojawia się błąd:

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

Istnieje indeksy zarówno url i source.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 
} 

Czy są jakieś ograniczenia dotyczące zapytań regularnych w indeksach subdokumentów?

+1

Czy powinien działać, co się stanie, gdy wykonasz wyjaśnienie? Czy próbowałeś go uruchomić z db pozwalającą skanować? (z wyjaśnieniem) –

+0

Próbowałem uruchomić wyjaśnienie, ale to trwało tak długo, że musiałem go zabić. Zapytania zwracają oczekiwane wyniki, jeśli włączę skanowanie tabeli. – tjrobinson

Odpowiedz

19

Po wyłączeniu skanowania tabeli oznacza to, że każde zapytanie, w którym skanowanie tabeli "wygrywa" w optymalizatorze zapytań, nie powiedzie się. Nie wysłałeś wyjaśnienia, ale rozsądnie jest założyć, że dzieje się to w oparciu o błąd. Spróbuj jawnie zasygnalizować indeks:

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

To powinno wyeliminować skanowanie tabeli jako możliwy wybór i pozwolić na powodzenie zapytania.

+0

Wygląda to obiecująco, chociaż dostaję: błąd: {"$ err": "zła wskazówka", "kod": 10113} – tjrobinson

+0

To błąd, który pojawia się, gdy podasz indeks, który nie istnieje. Co sugeruje, że albo go brakuje, jeszcze nie skończono budować (uwaga: prawda), albo możesz mieć literówkę. –

+0

Dobra uwaga, chociaż potwierdziłem, że indeks się zakończył i wciąż otrzymuję ten sam błąd. Co dziwniejsze, jeśli podam nazwę indeksu nie będącego subdocumentem, np. adres URL, otrzymuję wyniki, ale nie uwzględniają zapytania regex! Na przykład: db.articles.find ({"source.homeUrl": {$ regex:/^ http /}}). Hint ({"url": 1}) – tjrobinson