【问题标题】:Can I do a MongoDB "starts with" query on an indexed subdocument field?我可以对索引子文档字段执行 MongoDB“开始于”查询吗?
【发布时间】:2014-12-25 05:11:43
【问题描述】:

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

使用notablescan 禁用表扫描。

这行得通:

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

这不是:

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

我得到错误:

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

urlsource.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
}

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

【问题讨论】:

  • 应该工作,当你解释时会发生什么?您是否尝试使用允许扫描的数据库运行它? (有解释)
  • 我试过运行一个解释,但它花了很长时间我不得不杀死它。如果我启用表扫描,查询都会返回预期结果。

标签: regex mongodb search indexing full-table-scan


【解决方案1】:

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

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

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

【讨论】:

  • 这看起来很有希望,虽然我得到了:error: { "$err" : "bad hint", "code" : 10113 }
  • 当你指定一个不存在的索引时,你会得到这个错误。这表明它丢失了,尚未完成构建(注意背景:true),或者您可能有错字
  • 好点,虽然我已经确认索引已经完成构建并且仍然得到同样的错误。更奇怪的是,如果我指定非子文档索引的名称,例如url,我得到了结果,但他们不尊重正则表达式查询!例如:db.articles.find({"source.homeUrl" : { $regex : /^http/ }}).hint({"url" : 1})
  • 结果问题可能是由于这个错误:jira.mongodb.org/browse/SERVER-15235,目前还没有修复,即使在写这篇文章时也是如此。无法提示很奇怪,并且应该是可重现的,所以我会看看我是否可以实现它 - 你能说说你目前使用的版本吗?
  • 我们目前使用的是 2.4.9。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2018-12-01
  • 2013-12-11
  • 2019-07-11
  • 2011-08-28
相关资源
最近更新 更多