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