1.3.6. /db/_find
¶
-
POST
/{db}/_find
¶ 使用声明性JSON查询语法查找文档。查询可以使用内置 _all_docs 索引或自定义索引,使用 _index 端点。
参数: - db -- 数据库名称
请求标头: - Content-Type --
- application/json
请求JSON对象: - selector (json) -- 描述用于选择文档的条件的JSON对象。更多信息请参见 selector syntax . 要求的
- limit (number) -- 返回的最大结果数。默认为
25
. 可选的 - skip (number) -- 跳过第一个“n”结果,其中“n”是指定的值。 可选的
- sort (json) -- 以下是JSON数组 sort syntax . 可选的
- fields (array) -- JSON数组,指定应返回每个对象的哪些字段。如果省略,则返回整个对象。更多信息请参见 filtering fields . 可选的
- use_index (string|array) -- 指示查询使用特定索引。指定为
"<design_document>"
或["<design_document>", "<index_name>"]
. 可选的 - conflicts (boolean) -- 如果出现以下情况,则包括冲突文档
true
。预期用途是在没有索引或视图的情况下轻松查找冲突的文档。默认值为false
。 可选 - r (number) -- 读取结果所需的仲裁。默认值为1,在这种情况下,将返回在索引中找到的文档。如果设置为更高的值,则在返回结果之前,将至少从多个副本中读取每个文档。这可能比只使用本地存储在索引中的文档花费更多的时间。 可选,默认值:1
- bookmark (string) -- 一个字符串,允许您指定所需的结果页。用于对结果集进行分页。每个查询在
bookmark
然后可以在查询中传回以获得下一页结果的键。如果选择器查询的任何部分在请求之间更改,则结果未定义。 可选,默认:空 - update (boolean) -- 是否在返回结果之前更新索引。默认为
true
. 可选的 - stable (boolean) -- 是否应该从“稳定”的碎片集返回视图结果。 可选的
- stale (string) -- 组合
update=false
和stable=true
选项。可能的选择:"ok"
,false
(默认)。 可选的 请注意,此参数已弃用。使用stable
和update
相反。见 视图生成 了解更多详细信息。 - execution_stats (boolean) -- 包括 execution statistics 在查询响应中。 可选,默认:
false
响应头: - Content-Type -- application/json
- Transfer-Encoding --
chunked
响应JSON对象: - docs (object) -- 与搜索匹配的文档数组。在每个匹配文档中,在
fields
将列出请求主体的一部分及其值。 - warning (string) -- 执行警告
- execution_stats (object) -- 执行统计
- bookmark (string) -- 用于分页的不透明字符串。见
bookmark
请求(上面)中的字段以获取用法详细信息。
状态代码: - 200 OK -- 请求已成功完成
- 400 Bad Request -- 无效请求
- 401 Unauthorized -- 需要读取权限
- 404 Not Found -- 找不到请求的数据库
- 500 Internal Server Error -- 查询执行错误
这个 limit
和 skip
值与您期望的完全一样。同时 skip
存在,它不打算用于分页。原因是 bookmark
功能更有效。
请求 :
使用索引查找文档的请求正文示例:
POST /movies/_find HTTP/1.1 Accept: application/json Content-Type: application/json Content-Length: 168 Host: localhost:5984 { "selector": { "year": {"$gt": 2010} }, "fields": ["_id", "_rev", "year", "title"], "sort": [{"year": "asc"}], "limit": 2, "skip": 0, "execution_stats": true }响应 :
使用索引查找文档时的示例响应:
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Thu, 01 Sep 2016 15:41:53 GMT Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "docs": [ { "_id": "176694", "_rev": "1-54f8e950cc338d2385d9b0cda2fd918e", "year": 2011, "title": "The Tragedy of Man" }, { "_id": "780504", "_rev": "1-5f14bab1a1e9ac3ebdf85905f47fb084", "year": 2011, "title": "Drive" } ], "execution_stats": { "total_keys_examined": 0, "total_docs_examined": 200, "total_quorum_docs_examined": 0, "results_returned": 2, "execution_time_ms": 5.52 } }
1.3.6.1. 选择器语法¶
选择器被表示为描述感兴趣文档的JSON对象。在这个结构中,可以使用特殊命名的字段应用条件逻辑。
虽然选择器与MongoDB查询文档有一些相似之处,但这些都是出于目的的相似性,并不一定扩展到函数或结果的通用性。
1.3.6.1.1. 选择器基础知识¶
基本选择器语法要求您指定一个或多个字段,以及这些字段所需的相应值。此选择器匹配其“director”字段值为“Lars von Trier”的所有文档。
{
"director": "Lars von Trier"
}
A simple selector, inspecting specific fields
"selector": {
"title": "Live And Let Die"
},
"fields": [
"title",
"cast"
]
可以通过组合运算符来创建更复杂的选择器表达式。为了获得最佳性能,最好组合“组合”或“数组逻辑”运算符,例如 $regex
,使用相等运算符,例如 $eq
, $gt
, $gte
, $lt
和 $lte
(但不是) $ne
). 有关创建复杂选择器表达式的详细信息,请参见 creating selector expressions .
1.3.6.1.2. 带2个字段的选择器¶
此选择器匹配名称字段包含的任何文档 "Paul"
,并且还具有一个值为的位置字段 "Boston"
.
{
"name": "Paul",
"location": "Boston"
}
1.3.6.1.3. 子字段¶
使用更复杂的选择器,可以指定嵌套对象或子字段的字段值。例如,可以使用标准JSON结构来指定字段和子字段。
使用标准JSON结构的字段和子字段选择器示例:
{
"imdb": {
"rating": 8
}
}
缩写等价物使用点表示法将字段和子字段名称合并为一个名称。
{
"imdb.rating": 8
}
1.3.6.1.4. 算子¶
运算符通过在“名称”字段中使用美元符号($)前缀来标识。
选择器语法中有两种核心运算符类型:
- 组合运算符
- 条件运算符
通常,组合运算符应用于最高层的选择。它们用于将条件组合到一个选择器中,或创建条件的组合。
每个显式运算符都有以下形式:
{"$operator": argument}
没有显式运算符的选择器被视为具有隐式运算符。确切的隐式运算符由选择器表达式的结构决定。
1.3.6.1.5. 隐式运算符¶
有两个隐式运算符:
- 平等
- 和
在选择器中,任何包含JSON值但其中没有运算符的字段都被视为相等条件。隐式相等测试也适用于字段和子字段。
任何不是条件运算符参数的JSON对象都是每个字段上的隐式$and运算符。
在下面的示例中,我们使用运算符匹配任何文档,其中 "year"
字段的值大于 2010
:
{
"year": {
"$gt": 2010
}
}
在下一个示例中,必须有一个字段 "director"
字段的值必须完全等于 "Lars von Trier"
.
{
"director": "Lars von Trier"
}
也可以使相等运算符显式。
{
"director": {
"$eq": "Lars von Trier"
}
}
在下一个使用子字段的示例中,必选字段 "imdb"
在匹配的文档中还必须有一个子字段 "rating"
子字段的值必须等于 8
.
应用于子域测试的隐式运算符示例
{
"imdb": {
"rating": 8
}
}
同样,可以使相等运算符显式。
{
"imdb": {
"rating": { "$eq": 8 }
}
}
一个例子 $eq
与全文索引一起使用的运算符
{
"selector": {
"year": {
"$eq": 2001
}
},
"sort": [
"title:string"
],
"fields": [
"title"
]
}
一个 $eq
字段上与数据库索引一起使用的运算符 "year"
{
"selector": {
"year": {
"$eq": 2001
}
},
"sort": [
"year"
],
"fields": [
"year"
]
}
在本例中,字段 "director"
必须存在并包含值 "Lars von Trier"
还有场地 "year"
必须存在并具有价值 2003
.
{
"director": "Lars von Trier",
"year": 2003
}
你可以把这两个 $and
运算符和相等运算符显式。
使用explicit的示例$and
和$eq
算子
{
"$and": [
{
"director": {
"$eq": "Lars von Trier"
}
},
{
"year": {
"$eq": 2003
}
}
]
}
1.3.6.1.6. 显式运算符¶
除“Equality”和“and”外,所有运算符都必须明确声明。
1.3.6.1.7. 组合运算符¶
组合运算符用于组合选择器。除了大多数编程语言中常见的布尔运算符外,还有三种组合运算符 ($all
, $elemMatch
和 $allMatch
)它可以帮助您处理JSON数组和JSON映射 ($keyMapMatch
)
组合运算符接受单个参数。参数要么是另一个选择器,要么是一个选择器数组。
组合运算符列表:
算符 | 论证 | 目的 |
---|---|---|
$and |
数组 | 如果数组中的所有选择器匹配,则匹配。 |
$or |
数组 | 如果数组中的任何选择器匹配,则匹配。所有选择器必须使用相同的索引。 |
$not |
选择器 | 如果给定的选择器不匹配,则匹配。 |
$nor |
数组 | 如果数组中没有一个选择器匹配,则匹配。 |
$all |
数组 | 匹配数组值(如果它包含参数数组的所有元素)。 |
$elemMatch |
选择器 | 匹配并返回包含数组字段且至少有一个元素与所有指定查询条件匹配的所有文档。 |
$allMatch |
选择器 | 匹配并返回包含数组字段及其所有元素与所有指定查询条件匹配的所有文档。 |
$keyMapMatch |
选择器 | 匹配并返回包含至少包含一个匹配所有指定查询条件的键的映射的所有文档。 |
- The
$and
operator $and
用于两个字段的运算符
{
"selector": {
"$and": [
{
"title": "Total Recall"
},
{
"year": {
"$in": [1984, 1991]
}
}
]
},
"fields": [
"year",
"title",
"cast"
]
}
这个 $and
如果数组中的所有选择器都匹配,则运算符匹配。下面是使用主索引的示例 (_all_docs
):
{
"$and": [
{
"_id": { "$gt": null }
},
{
"year": {
"$in": [2014, 2015]
}
}
]
}
The $or
operator
这个 $or
如果数组中的任何选择器匹配,则运算符匹配。下面是一个与字段上的索引一起使用的示例 "year"
:
{
"year": 1977,
"$or": [
{ "director": "George Lucas" },
{ "director": "Steven Spielberg" }
]
}
The $not
operator
这个 $not
如果给定的选择器不匹配,则运算符匹配。下面是一个与字段上的索引一起使用的示例 "year"
:
{
"year": {
"$gte": 1900
},
"year": {
"$lte": 1903
},
"$not": {
"year": 1901
}
}
The $nor
operator
这个 $nor
如果给定的选择器不匹配,则运算符匹配。下面是一个与字段上的索引一起使用的示例 "year"
:
{
"year": {
"$gte": 1900
},
"year": {
"$lte": 1910
},
"$nor": [
{ "year": 1901 },
{ "year": 1905 },
{ "year": 1907 }
]
}
The $all
operator
这个 $all
运算符匹配数组值(如果它包含参数数组的所有元素)。下面是一个与主索引一起使用的示例 (_all_docs
):
{
"_id": {
"$gt": null
},
"genre": {
"$all": ["Comedy","Short"]
}
}
The $elemMatch
operator
这个 $elemMatch
运算符匹配并返回包含数组字段且至少有一个元素与提供的查询条件匹配的所有文档。下面是一个与主索引一起使用的示例 (_all_docs
):
{
"_id": { "$gt": null },
"genre": {
"$elemMatch": {
"$eq": "Horror"
}
}
}
The $allMatch
operator
这个 $allMatch
运算符匹配并返回包含数组字段及其所有元素与提供的查询条件匹配的所有文档。下面是一个与主索引一起使用的示例 (_all_docs
):
{
"_id": { "$gt": null },
"genre": {
"$allMatch": {
"$eq": "Horror"
}
}
}
The $keyMapMatch
operator
这个 $keyMapMatch
运算符匹配并返回包含映射的所有文档,该映射至少包含一个匹配所有指定查询条件的键。下面是一个与主索引一起使用的示例 (_all_docs
):
{
"_id": { "$gt": null },
"cameras": {
"$keyMapMatch": {
"$eq": "secondary"
}
}
}
1.3.6.1.8. 条件运算符¶
条件运算符特定于某个字段,用于计算存储在该字段中的值。例如,基本的 $eq
当指定字段包含与提供的参数相等的值时,运算符匹配。
注解
要使条件运算符正常工作,字段 必须存在 在文档中选择要匹配的选择器。举个例子, $ne
表示指定的字段必须存在,并且不等于参数的值。
支持大多数编程语言常用的基本相等和不等运算符。使用严格的类型匹配。
此外,还可以使用一些“元”条件运算符。一些条件操作符接受任何有效的JSON内容作为参数。其他条件运算符要求参数采用特定的JSON格式。
操作员类型 | 算符 | 论证 | 目的 |
---|---|---|---|
(In)平等 | $lt |
任何JSON | 字段小于参数 |
$lte |
任何JSON | 字段小于或等于参数。 | |
$eq |
任何JSON | 字段等于参数 | |
$ne |
任何JSON | 字段不等于参数。 | |
$gte |
任何JSON | 字段大于或等于参数。 | |
$gt |
任何JSON | 字段大于参数的to。 | |
对象 | $exists |
布尔 | 检查字段是否存在,无论其值如何。 |
$type |
弦 | 检查文档字段的类型。有效值为 "null" , "boolean" , "number" , "string" , "array" 和 "object" . |
|
数组 | $in |
JSON值数组 | 文档字段必须存在于提供的列表中。 |
$nin |
JSON值数组 | 文档字段不必存在于提供的列表中。 | |
$size |
整数 | 匹配文档中数组字段长度的特殊条件。非数组字段不能与此条件匹配。 | |
其他 | $mod |
[除数,余数] | 除数和余数都是正整数或负整数。非整数值导致404。匹配文档的位置 field % Divisor == Remainder 为true,并且仅当文档字段为整数时。 |
$regex |
弦 | 与文档字段匹配的正则表达式模式。仅当字段为字符串值且与提供的正则表达式匹配时才匹配。匹配算法基于Perl兼容正则表达式(PCRE)库。有关实现内容的更多信息,请参见 Erlang Regular Expression |
警告
正则表达式不能处理索引,因此不应使用它们来筛选大型数据集。但是,它们可以用来限制 partial index .
1.3.6.1.9. 选择器表达式创建¶
我们已经看到了组合选择器表达式的示例,例如 using explicit $and and $eq operators .
一般来说,只要有一个接受参数的运算符,该参数本身就可以是另一个具有自己参数的运算符。这使我们能够构建更复杂的选择器表达式。
但是,只有相等运算符,例如 $eq
, $gt
, $gte
, $lt
和 $lte
(但不是) $ne
)可以用作查询的基础。您应该在选择器中至少包含其中一个。
例如,如果您尝试执行一个查询,该查询尝试匹配具有名为的字段的所有文档 afieldname 包含以字母开头的值 A ,这将触发警告,因为无法使用索引,并且数据库将对主索引执行完全扫描:
Request
POST /movies/_find HTTP/1.1 Accept: application/json Content-Type: application/json Content-Length: 112 Host: localhost:5984 { "selector": { "afieldname": {"$regex": "^A"} } }响应 :
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Thu, 01 Sep 2016 17:25:51 GMT Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "warning":"no matching index found, create an index to optimize query time", "docs":[ ] }
警告
在生产环境中部署时,始终建议您创建适当的索引。
大多数选择器表达式与给定运算符的工作方式完全相同。但情况并非总是这样:例如,字符串的比较是用ICU完成的,如果您希望使用ASCII排序,则可能会得到令人惊讶的结果。看到了吗 视图排序 了解更多详细信息。
1.3.6.2. 排序语法¶
这个 sort
字段包含字段名和方向对的列表,以基本数组表示。第一个字段名和方向对是最高层的排序。第二对(如果提供)是下一级排序。
字段可以是任何字段,如果子文档字段需要,则使用点符号。
方向值是 "asc"
上升,和 "desc"
用于下降。如果忽略方向值,则默认值为 "asc"
使用。
例如,按2个字段排序:
[{"fieldName1": "desc"}, {"fieldName2": "desc" }]
例如,按两个字段排序,假设两个字段的默认方向:
["fieldNameA", "fieldNameB"]
一个典型的需求是使用选择器搜索某些内容,然后根据指定的字段按所需的方向对结果进行排序。
要使用排序,请确保:
- 选择器中至少包含一个排序字段。
- 已在所有字段中定义了相同的排序
- 秩序。
- 排序数组中的每个对象都有一个键。
如果排序数组中的对象没有一个键,则生成的排序顺序是特定于实现的,并且可能会更改。
Find不支持具有不同排序顺序的多个字段,因此方向必须全部为升序或全部降序。
对于文本搜索排序中的字段名,有时需要指定字段类型,例如:
{ "<fieldname>:string": "asc"}
如果可能,尝试根据选择器查找字段类型。在不明确的情况下,必须显式提供字段类型。
当字段包含不同的数据类型时,未定义排序顺序。这是文本索引和视图索引之间的一个重要区别。在将来的版本中,具有不同数据类型的字段的排序行为可能会发生变化。
一个简单的查询,使用排序:
{
"selector": {"Actor_name": "Robert De Niro"},
"sort": [{"Actor_name": "asc"}, {"Movie_runtime": "asc"}]
}
1.3.6.3. 过滤字段¶
从数据库中进行选择时,可以精确指定为文档返回哪些字段。这两个优点是:
- 您的结果仅限于文档中
- 申请所需。
- 减小响应的大小。
返回的字段被指定为数组。
响应中只包含指定的筛选器字段。没有自动包含 _id
或包含字段列表时的其他元数据字段。
从匹配文档中选择性检索字段的示例:
{ "selector": { "Actor_name": "Robert De Niro" }, "fields": ["Actor_name", "Movie_year", "_id", "_rev"] }
1.3.6.4. 分页¶
芒果查询支持通过书签字段进行分页。每个 _find
响应包含一个书签-CouchDB用来确定在进行后续查询时从哪里恢复的令牌。要获得下一组查询结果,请将上一次响应中收到的书签添加到您的下一次请求中。别忘了保存好 selector 相同,否则会收到意想不到的结果。要向后分页,可以使用上一个书签返回上一组结果。
请注意,书签的存在并不能保证有更多的结果。您可以通过比较返回的结果数与请求的页面大小来测试是否已到达结果集的结尾-如果返回结果< limit ,没有了。
1.3.6.5. 执行统计¶
Find可以返回特定请求的基本执行统计信息。与 _explain 端点,这应该提供一些关于索引是否被有效使用的见解。
当前的执行统计包括:
场 | 描述 |
---|---|
total_keys_examined |
检查的索引键数。当前始终为0。 |
total_docs_examined |
从数据库/索引中提取的文档数,相当于使用 include_docs=true 一种观点。然后可以在内存中过滤这些数据,以进一步缩小基于选择器的结果集的范围。 |
total_quorum_docs_examined |
使用带外文档获取从数据库中获取的文档数。当在查询参数中指定read quorum>1时,此值仅为非零。 |
results_returned |
从查询返回的结果数。理想情况下,这不应显著低于检查的文档/密钥总数。 |
execution_time_ms |
数据库测量的总执行时间(毫秒)。 |
1.3.7. /db/_index
¶
Mango是一种用于CouchDB数据库的声明性JSON查询语言。芒果包装了几种索引类型,从开箱即用的主索引开始。芒果指数,带索引类型 json ,是使用MapReduce视图生成的。
-
POST
/{db}/_index
¶ 在数据库上创建新索引
参数: - db -- 数据库名称
请求标头: - Content-Type --
- application/json
查询参数: - index (json) -- 描述要创建的索引的JSON对象。
- ddoc (string) -- 将在其中创建索引的设计文档的名称。默认情况下,每个索引将在其自己的设计文档中创建。为了提高效率,可以将索引分组到设计文档中。但是,更改设计文档中的一个索引将使同一文档中的所有其他索引失效(类似于视图)。 可选的
- name (string) -- 索引的名称。如果没有提供名称,则会自动生成一个名称。 可选的
- type (string) -- 可以是
"json"
或"text"
. 默认为json。未来将支持地理空间索引。 可选的 通过第三方库支持文本索引 可选的 - partitioned (boolean) -- 确定JSON索引是分区的还是全局的。的默认值
partitioned
是partitioned
属性。要在分区数据库上创建全局索引,请指定false
对于"partitioned"
字段。如果您指定true
对于"partitioned"
字段,则发生错误。
响应头: - Content-Type -- application/json
- Transfer-Encoding --
chunked
响应JSON对象: - result (string) -- 用于显示索引是已创建还是已存在的标志。可以是
"created"
或"exists"
。 - id (string) -- 在其中创建索引的设计文档的Id。
- name (string) -- 创建的索引的名称。
状态代码: - 200 OK -- 索引创建成功或已存在
- 400 Bad Request -- 无效请求
- 401 Unauthorized -- 需要管理员权限
- 404 Not Found -- 找不到数据库
- 500 Internal Server Error -- 执行错误
这个 Index object 是具有以下字段的JSON对象:
JSON对象: - fields (array) -- 属性后面的字段名称数组 sort syntax 。也允许嵌套字段,例如 "person.name" 。
- partial_filter_selector (json) -- A selector 要在索引时应用于文档,请创建 partial index . 可选的
为名为的字段创建新索引的示例
foo
:请求 :
POST /db/_index HTTP/1.1 Content-Type: application/json Content-Length: 116 Host: localhost:5984 { "index": { "fields": ["foo"] }, "name" : "foo-index", "type" : "json" }
返回的JSON确认索引已经创建:
响应 :
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 96 Content-Type: application/json Date: Thu, 01 Sep 2016 18:17:48 GMT Server: CouchDB (Erlang OTP/18) { "result":"created", "id":"_design/a5f4711fc9448864a13c81dc71e660b524d7410c", "name":"foo-index" }
使用所有可用查询参数创建索引示例
请求 :
POST /db/_index HTTP/1.1 Content-Type: application/json Content-Length: 396 Host: localhost:5984 { "index": { "partial_filter_selector": { "year": { "$gt": 2010 }, "limit": 10, "skip": 0 }, "fields": [ "_id", "_rev", "year", "title" ] }, "ddoc": "example-ddoc", "name": "example-index", "type": "json", "partitioned": false }
默认情况下,JSON索引将包括所有存在索引字段的文档,包括那些具有空值的文档。
1.3.7.1. 部分指标¶
部分索引允许在索引时对文档进行筛选,这可能会显著提高查询选择器的性能,因为查询选择器不能清晰地映射到索引上的范围查询。
让我们看一个查询示例:
{
"selector": {
"status": {
"$ne": "archived"
},
"type": "user"
}
}
如果没有部分索引,则需要进行完整索引扫描以查找 "type":"user"
不具有状态的 "archived"
. 这是因为普通索引只能用于匹配连续行,而 "$ne"
操作员不能保证。
为了提高响应时间,我们可以创建一个索引来排除 "status": {{ "$ne": "archived" }}
在索引时使用 "partial_filter_selector"
领域:
POST /db/_index HTTP/1.1
Content-Type: application/json
Content-Length: 144
Host: localhost:5984
{
"index": {
"partial_filter_selector": {
"status": {
"$ne": "archived"
}
},
"fields": ["type"]
},
"ddoc" : "type-not-archived",
"type" : "json"
}
除非由指定,否则查询规划器当前不使用部分索引 "use_index"
字段,因此我们需要修改原始查询:
{
"selector": {
"status": {
"$ne": "archived"
},
"type": "user"
},
"use_index": "type-not-archived"
}
从技术上讲,我们不需要在 "status"
查询选择器中的字段-部分索引确保这始终正确-但包含它可以使选择器的意图更清楚,并更容易利用查询规划的未来改进(例如,部分索引的自动选择)。
注解
只有当选择器包括所有索引的字段时,才使用带字段的索引。例如,如果索引包含 ["a". "b"]
但是选择器只需要字段 ["a"]
要存在于匹配的文档中,索引将对查询无效。但是,可以将所有索引视为包括特殊字段 _id
和 _rev
。他们 绝不可能 需要在查询选择器中指定。
-
GET
/{db}/_index
¶ 当你做出一个
GET
请求到/db/_index
,将获得数据库中所有索引的列表。除了通过此API提供的信息外,索引还存储在设计文档<index functions>中。设计文档是具有以开头的ID的常规文档_design/
. 设计文档可以像任何其他文档一样被检索和修改,尽管在使用Mango时这不是必需的。参数: - db -- 数据库名称。
响应头: - Content-Type -- application/json
- Transfer-Encoding --
chunked
响应JSON对象: - total_rows (number) -- 索引数
- indexes (object) -- 索引定义数组
状态代码: - 200 OK -- 成功
- 400 Bad Request -- 无效请求
- 401 Unauthorized -- 需要读取权限
- 500 Internal Server Error -- 执行错误
- 索引对象的格式:
- ddoc :索引所属的设计文档的ID。这个身份证
- 可用于检索包含索引的设计文档,方法是
GET
请求到/db/ddoc
在哪里ddoc
是此字段的值。
- name :索引的名称。
- type :索引的类型。目前“json”是唯一
- 支持的类型。
- def :索引的定义,包含索引字段
- 排序顺序:升序或降序。
请求 :
GET /db/_index HTTP/1.1 Accept: application/json Host: localhost:5984
响应 :
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 238 Content-Type: application/json Date: Thu, 01 Sep 2016 18:17:48 GMT Server: CouchDB (Erlang OTP/18) { "total_rows": 2, "indexes": [ { "ddoc": null, "name": "_all_docs", "type": "special", "def": { "fields": [ { "_id": "asc" } ] } }, { "ddoc": "_design/a5f4711fc9448864a13c81dc71e660b524d7410c", "name": "foo-index", "type": "json", "def": { "fields": [ { "foo": "asc" } ] } } ] }
-
DELETE
/{db}/_index/{designdoc}/json/{name}
¶ 参数: - db -- 数据库名称。
- designdoc -- 设计文件名称。
- name -- 索引名称。
响应头: - Content-Type -- application/json
响应JSON对象: - ok (string) -- "true" 如果成功。
状态代码: - 200 OK -- 成功
- 400 Bad Request -- 无效请求
- 401 Unauthorized -- 需要写入权限
- 404 Not Found -- 找不到索引
- 500 Internal Server Error -- 执行错误
请求 :
DELETE /db/_index/_design/a5f4711fc9448864a13c81dc71e660b524d7410c/json/foo-index HTTP/1.1 Accept: */* Host: localhost:5984
响应 :
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Length: 12 Content-Type: application/json Date: Thu, 01 Sep 2016 19:21:40 GMT Server: CouchDB (Erlang OTP/18) { "ok": true }
1.3.8. /db/_explain
¶
-
POST
/{db}/_explain
¶ 显示查询正在使用哪个索引。参数与 _find
参数: - db -- 数据库名称
请求标头: - Content-Type -- application/json
响应头: - Content-Type -- application/json
- Transfer-Encoding --
chunked
响应JSON对象: - dbname (string) -- 数据库名称
- index (object) -- 用于完成查询的索引
- selector (object) -- 使用的查询选择器
- opts (object) -- 使用的查询选项
- limit (number) -- 使用的限制参数
- skip (number) -- 使用的跳过参数
- fields (array) -- 要由查询返回的字段
- range (object) -- 传递到基础视图的范围参数
状态代码: - 200 OK -- 请求已成功完成
- 400 Bad Request -- 无效请求
- 401 Unauthorized -- 需要读取权限
- 500 Internal Server Error -- 执行错误
请求 :
POST /movies/_explain HTTP/1.1 Accept: application/json Content-Type: application/json Content-Length: 168 Host: localhost:5984 { "selector": { "year": {"$gt": 2010} }, "fields": ["_id", "_rev", "year", "title"], "sort": [{"year": "asc"}], "limit": 2, "skip": 0 }
响应 :
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Thu, 01 Sep 2016 15:41:53 GMT Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "dbname": "movies", "index": { "ddoc": "_design/0d61d9177426b1e2aa8d0fe732ec6e506f5d443c", "name": "0d61d9177426b1e2aa8d0fe732ec6e506f5d443c", "type": "json", "def": { "fields": [ { "year": "asc" } ] } }, "selector": { "year": { "$gt": 2010 } }, "opts": { "use_index": [], "bookmark": "nil", "limit": 2, "skip": 0, "sort": {}, "fields": [ "_id", "_rev", "year", "title" ], "r": [ 49 ], "conflicts": false }, "limit": 2, "skip": 0, "fields": [ "_id", "_rev", "year", "title" ], "range": { "start_key": [ 2010 ], "end_key": [ {} ] } }
1.3.8.1. 指标选择¶
_find 选择用于响应查询的索引,除非在查询时指定索引。
查询规划器查看选择器部分,并查找与查询中使用的运算符和字段最匹配的索引。如果有两个或多个json类型索引匹配,则首选索引中字段数最少的索引。如果仍有两个或多个候选索引,则选择具有第一个字母名称的索引。
注解
最好在查询中显式指定索引。这可以防止现有查询受到可能在生产环境中添加的新索引的影响。