couchdb - 即使手动指定芒果索引“不包含此查询的有效索引”
问题描述
我正在尝试通过 Mango 有效地查询数据(因为这似乎是我的要求的唯一选择Searching for sub-objects with a date range contains the queried date value),但我什至无法获得一个非常简单的索引/查询对工作:虽然我为查询手动指定了我的索引,但我被告知我的索引“未使用,因为它不包含此查询的有效索引。找不到匹配的索引,创建一个索引以优化查询时间。”
(我在 CouchDB v. 3.0.0 上通过 Fauxton 完成所有这些工作)
假设我的文档如下所示:
{
"tenant": "TNNT_a",
"$doctype": "JobOpening",
// a bunch of other fields
}
所有带有$doctype
“JobOpening”的文档都保证具有tenant
属性。我希望执行的搜索将只针对具有$doctype
“JobOpening”的文档,并且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 执行完整扫描。
解决方案
未使用索引,因为$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
这种变化是否直观尚不清楚,但它是一致的 - 并且可能不希望显示带有“特殊”字符的前导字段名称。
关于过滤字段的索引,根据有关 partial_filter_selector 的文档
从技术上讲,我们不需要在查询选择器的“状态”[例如 $doctype here] 字段中包含过滤器 - 部分索引确保这始终是正确的 - 但包含它会使选择器的意图更清晰,并使更容易利用查询计划的未来改进(例如部分索引的自动选择)。
尽管如此,我不会选择索引值恒定的字段。
推荐阅读
- angular - 如何在 Angular 7 中将表格数据导出为 PDF 和打印功能?
- vb.net - 如何使公共子窗体 ShowDialog
- java - CI/CD - 在发布分支、管道或源代码构建上标记 jar 工件?
- javascript - 为什么 json_encoded 数据不显示
- html - Angular:粘性生成的列
- c# - 需要帮助在 C# 中将类的对象作为参数传递时 Typecast 得到 NULL 值
- xamarin.forms - Xamarin.Forms/iOS - 隐藏的父控件未使用自定义渲染器正确渲染其子控件
- sql - 如果 tbl_2 中存在“记录代码”,则从 tbl_1 中选择“记录代码”
- python - 使用 Anaconda/Python 在 PowerShell 中将 unicode 字符写入文件失败
- javascript - 撤消 JS 中的覆盖粘贴