Можно ли выполнить запрос MongoDB "начинается с" в индексированном поддокументе?

Я пытаюсь найти документы, где поле начинается со значения.

Сканирование таблицы отключено с помощью notablescan.

Это работает:

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

Это не означает:

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

Я получаю сообщение об ошибке:

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

На индексах url и 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
}

Существуют ли ограничения с запросами регулярных выражений на индексы поддокумента?

Ответы

Ответ 1

При отключении сканирования таблиц это означает, что любой запрос, в котором сканирование таблицы "выигрывает" в оптимизаторе запросов, не будет работать. Вы не указали объяснение, но разумно предположить, что здесь происходит на основе ошибки. Попробуйте явно указать этот индекс:

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

Это должно устранить сканирование таблицы как возможный выбор и позволить запросу успешно вернуться.