56

我正在尝试查找字段以值开头的文档。

使用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
}

对子文档索引的正则表达式查询是否有任何限制?

4

1 回答 1

63

当您禁用表扫描时,这意味着在查询优化器中表扫描“获胜”的任何查询都将无法运行。您还没有发布解释,但根据错误假设这就是这里发生的事情是合理的。尝试明确提示索引:

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

这应该消除表扫描作为一种可能的选择,并允许查询成功返回。

于 2014-10-29T15:56:21.657 回答