2014-10-29 15 views
17

Sto cercando di trovare documenti in cui un campo inizia con un valore.Posso eseguire una query "inizia con" MongoDB su un campo del documento secondario indicizzato?

Le scansioni di tabelle sono disabilitate utilizzando notablescan.

Questo funziona:

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

Questo non lo fa:

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

ottengo l'errore:

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

Ci sono indici su entrambi url e 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 
} 

Esistono limitazioni con le query regex sugli indici di documenti secondari?

+1

Dovrebbe funzionare, cosa succede quando si fa una spiegazione? Hai provato a eseguirlo con un db che consente la scansione? (con spiegazioni) –

+0

Ho provato a eseguire una spiegazione ma ci è voluto così tanto tempo che dovevo ucciderlo. Le query restituiscono entrambi i risultati previsti se abilito le scansioni della tabella. – tjrobinson

risposta

19

Quando si disabilitano le scansioni delle tabelle, significa che qualsiasi query in cui una scansione della tabella "vince" in Query Optimizer non verrà eseguita. Non hai pubblicato una spiegazione, ma è ragionevole presumere che ciò che sta accadendo qui sia basato sull'errore. Prova suggerendo l'indice in modo esplicito:

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

Questo dovrebbe eliminare la tabella di scansione come una possibile scelta e permettono la query per tornare con successo.

+0

Questo sembra promettente anche se sto ottenendo: errore: {"$ err": "suggerimento cattivo", "codice": 10113} – tjrobinson

+0

Questo è l'errore che si ottiene quando si specifica un indice che non esiste. Il che suggerisce che o manca, non è ancora finito di costruire (nota di fondo: vero), o che potresti avere un refuso –

+0

Un buon punto, anche se ho confermato che l'indice ha finito di costruire e continua a ricevere lo stesso errore. Ancora più stranamente, se si specifica il nome di un indice non di documento secondario, ad es. url, ottengo risultati indietro ma non rispettano la query regex! Ad esempio: db.articles.find ({"source.homeUrl": {$ regex:/^ http /}}). Hint ({"url": 1}) – tjrobinson

Problemi correlati