Couchdb 芒果指数“;不包含此查询的有效索引";即使手动指定

Couchdb 芒果指数“;不包含此查询的有效索引";即使手动指定,couchdb,couchdb-mango,Couchdb,Couchdb Mango,我试图通过Mango高效地查询数据(鉴于我的需求,这似乎是唯一的选择),但我甚至无法使用非常简单的索引/查询对:尽管我为查询手动指定了索引,但我被告知我的索引“未使用,因为它不包含此查询的有效索引。找不到匹配的索引,请创建索引以优化查询时间。“ (我通过CouchDB v.3.0.0上的Fauxton完成了所有这些) 假设我的文档如下所示: { "tenant": "TNNT_a", "$doctype": "

我试图通过Mango高效地查询数据(鉴于我的需求,这似乎是唯一的选择),但我甚至无法使用非常简单的索引/查询对:尽管我为查询手动指定了索引,但我被告知我的索引“未使用,因为它不包含此查询的有效索引。找不到匹配的索引,请创建索引以优化查询时间。“

(我通过CouchDB v.3.0.0上的Fauxton完成了所有这些)

假设我的文档如下所示:

{
    "tenant": "TNNT_a",
    "$doctype": "JobOpening",
    // a bunch of other fields
}
所有
$doctype
为“JobOpening”的文档都保证有
租户
属性。我希望执行的搜索将只针对
$doctype
为“JobOpening”的文档,查询时将始终提供
租户
选择器

以下是我配置的测试索引:

{
   "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"
}
    {
       "selector": {
          "tenant": "TNNT_a",
          "\\$doctype": "JobOpening"
       },
       "use_index": "job-openings-doctype-index"
    }
为什么索引不用于查询


我尝试过不使用部分索引,我认为
$doctype
转义在必要的位置正确完成,但似乎没有任何东西阻止CouchDB执行完全扫描。

索引未被使用,因为
$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"
}
    {
       "selector": {
          "tenant": "TNNT_a",
          "\\$doctype": "JobOpening"
       },
       "use_index": "job-openings-doctype-index"
    }
返回预期结果,并生成一个“解释”,确认查询了
职务空缺doctype索引

{
 "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
这一变化是否直观尚不清楚,但它是一致的——并且可能会显示带有“特殊”字符的前导字段名可能并不可取

关于筛选字段的索引,按照

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


尽管如此,我不会选择索引一个值为常量的字段。

谢谢您的回答!我曾尝试在任何地方转义
\\$doctype
,但似乎我被Fauxton绊倒了:第一个查询似乎报告没有使用索引(因为它正在生成?),但随后的查询(事件重新运行相同的查询)确实要使用索引。不幸的是,当您为数组属性编制索引并尝试将某个项与
$elemMatch
(这是我的主要目标)相匹配时,索引最终会被完全忽略。。。