【问题标题】:Mango index "does not contain a valid index for this query" even when specified manually即使手动指定芒果索引“不包含此查询的有效索引”
【发布时间】:2021-03-19 10:23:24
【问题描述】:

我正在尝试通过 Mango 有效地查询数据(鉴于我的要求 Searching for sub-objects with a date range containing the queried date value,这似乎是唯一的选择),但我什至无法让一个非常简单的索引/查询对工作:虽然我指定我的索引手动用于查询,我被告知我的索引“未使用,因为它不包含此查询的有效索引。找不到匹配的索引,创建一个索引以优化查询时间。”

(我在 CouchDB v. 3.0.0 上通过 Fauxton 完成所有这些工作)

假设我的文档如下所示:

{
    "tenant": "TNNT_a",
    "$doctype": "JobOpening",
    // a bunch of other fields
}

所有带有“JobOpening”$doctype 的文档都保证具有tenant 属性。我希望执行的搜索将永远只针对具有“JobOpening”的$doctype 的文档,并且在查询时将始终提供tenant 选择器。

这是我配置的测试索引:

{
   "index": {
      "fields": [
          "tenant",
          "$doctype"
      ],
      "partial_filter_selector": {
        "\\$doctype": {
          "$eq": "JobOpening"
        }
      }
   },
   "ddoc": "job-openings-doctype-index",
   "type": "json"
}

这是查询

{
   "selector": {
      "tenant": "TNNT_a",
      "\\$doctype": "JobOpening"
   },
   "use_index": "job-openings-doctype-index"
}

为什么没有用于查询的索引?

我尝试过不使用部分索引,并且我认为 $doctype 转义在必要的地方正确完成,但似乎没有什么可以阻止 CouchDB 执行完整扫描。

【问题讨论】:

    标签: couchdb couchdb-mango


    【解决方案1】:

    未使用索引,因为查询计划程序未按预期识别$doctype 字段。

    将设计文档中的字段声明从$doctype 更改为\\$doctype 即可解决问题。

    {
       "index": {
          "fields": [
              "tenant",
              "\\$doctype"
          ],
          "partial_filter_selector": {
            "\\$doctype": {
              "$eq": "JobOpening"
            }
          }
       },
       "ddoc": "job-openings-doctype-index",
       "type": "json"
    }
    

    在那次小重构之后,查询

        {
           "selector": {
              "tenant": "TNNT_a",
              "\\$doctype": "JobOpening"
           },
           "use_index": "job-openings-doctype-index"
        }
    

    返回预期结果,并产生一个“解释”,确认 job-openings-doctype-index 已被查询:

    {
     "dbname": "stack",
     "index": {
      "ddoc": "_design/job-openings-doctype-index",
      "name": "7f5c5cea5acd90f11fffca3e3355b6a03677ad53",
      "type": "json",
      "def": {
       "fields": [
        {
         "tenant": "asc"
        },
        {
         "\\$doctype": "asc"
        }
       ],
       "partial_filter_selector": {
        "\\$doctype": {
         "$eq": "JobOpening"
        }
       }
      }
     },
    // etc etc etc
    

    这种变化是否直观尚不清楚,但它是一致的 - 并且可能不希望显示带有“特殊”字符的前导字段名称。

    关于过滤字段的索引,按照documentation regarding partial_filter_selector

    从技术上讲,我们不需要在“状态”中包含过滤器 [e.g. $doctype here] 查询选择器中的字段 - 部分索引 确保这始终是正确的 - 但包括它会使 选择器更清晰,更容易利用未来 查询计划的改进(例如,自动选择部分 索引)。

    尽管如此,我不会选择索引值恒定的字段。

    【讨论】:

    • 感谢您的回答!我曾尝试在任何地方转义\\$doctype,但似乎我被Fauxton绊倒了:似乎第一个查询报告没有使用索引(因为它正在构建?)但随后的查询(事件重新运行同一个)确实使用索引。不幸的是,当您索引一个数组属性并尝试将一个项目与$elemMatch(这是我的主要目标stackoverflow.com/questions/66674336/…)匹配时,索引最终会被完全忽略......
    猜你喜欢
    • 2016-02-06
    • 2015-05-19
    • 2016-03-10
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多