web-dev-qa-db-fra.com

Puis-je faire une requête MongoDB "commence par" sur un champ de sous-document indexé?

J'essaie de trouver des documents où un champ commence par une valeur.

Les analyses de table sont désactivées à l'aide de notablescan .

Cela marche:

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

Cela ne veut pas:

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

Je reçois l'erreur:

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

Il existe des index sur url et 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
}

Y a-t-il des limitations avec les requêtes regex sur les index de sous-documents?

27
Tom Robinson

Lorsque vous désactivez les analyses de table, cela signifie que toute requête dans laquelle une analyse de table "gagne" dans l'optimiseur de requête ne s'exécutera pas. Vous n'avez pas posté d'explication, mais il est raisonnable de supposer que c'est ce qui se passe ici en fonction de l'erreur. Essayez d'indiquer explicitement l'index:

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

Cela devrait éliminer l'analyse de table comme un choix possible et permettre à la requête de retourner avec succès.

33
Adam Comerford