1.3.6. /db/_find

POST /{db}/_find

使用声明性JSON查询语法查找文档。查询可以使用内置 _all_docs 索引或自定义索引,使用 _index 端点。

参数
  • db -- 数据库名称

请求标头
请求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>"] . 可选的

  • r (number) -- 读取结果所需的仲裁。默认值为1,在这种情况下,将返回在索引中找到的文档。如果设置为更高的值,则在返回结果之前,将至少从多个副本中读取每个文档。这可能比只使用本地存储在索引中的文档花费更多的时间。 可选,默认值:1

  • bookmark (string) -- 一个字符串,允许您指定所需的结果页。用于对结果集进行分页。每个查询在 bookmark 然后可以在查询中传回以获得下一页结果的键。如果选择器查询的任何部分在请求之间更改,则结果未定义。 可选,默认:空

  • update (boolean) -- 是否在返回结果之前更新索引。默认为 true . 可选的

  • stable (boolean) -- 是否应该从“稳定”的碎片集返回视图结果。 可选的

  • stale (string) -- 组合 update=falsestable=true 选项。可能的选择: "ok"false (默认)。 可选的 请注意,此参数已弃用。使用 stableupdate 相反。见 视图生成 了解更多详细信息。

  • execution_stats (boolean) -- 包括 execution statistics 在查询响应中。 Optional, default: ``false``

响应头
响应JSON对象
  • docs (object) -- 与搜索匹配的文档数组。在每个匹配文档中,在 fields 将列出请求主体的一部分及其值。

  • warning (string) -- 执行警告

  • execution_stats (object) -- 执行统计

  • bookmark (string) -- 用于分页的不透明字符串。见 bookmark 请求(上面)中的字段以获取用法详细信息。

状态代码

这个 limitskip 值与您期望的完全一样。同时 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 当指定字段包含等于提供的参数的值时,运算符匹配。

支持大多数编程语言通用的基本相等和不等运算符。此外,还提供了一些“元”条件运算符。某些条件运算符接受任何有效的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.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 -- 数据库名称

请求标头
查询参数
  • index (json) -- 描述要创建的索引的JSON对象。

  • ddoc (string) -- 将在其中创建索引的设计文档的名称。默认情况下,每个索引将在其自己的设计文档中创建。为了提高效率,可以将索引分组到设计文档中。但是,更改设计文档中的一个索引将使同一文档中的所有其他索引失效(类似于视图)。 可选的

  • name (string) -- 索引的名称。如果没有提供名称,则会自动生成一个名称。 可选的

  • type (string) -- 可以是 "json""text" . 默认为json。未来将支持地理空间索引。 可选的 通过第三方库支持文本索引 可选的

  • partial_filter_selector (json) -- A selector 要在索引时应用于文档,请创建 partial index . 可选的

  • partitioned (boolean) -- 确定JSON索引是分区的还是全局的。的默认值 partitionedpartitioned 属性。要在分区数据库上创建全局索引,请指定 false 对于 "partitioned" 字段。如果您指定 true 对于 "partitioned" 字段,则发生错误。

响应头
响应JSON对象
  • result (string) -- 用于显示索引是已创建还是已存在的标志。可以是 "created""exists" .

  • id (string) -- 在其中创建索引的设计文档的Id。

  • name (string) -- 创建的索引的名称。

状态代码

JSON类型索引的索引对象格式

index对象是一个JSON数组,字段名在 sort syntax . 也允许嵌套字段,例如。 "person.name" .

为名为的字段创建新索引的示例 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"
}

使用所有可用查询参数创建索引示例

{
  "selector": {
    "year": {
      "$gt": 2010
    }
  },
  "fields": ["_id", "_rev", "year", "title"],
  "sort": [{"year": "asc"}],
  "limit": 10,
  "skip": 0
}

默认情况下,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" 查询选择器中的字段-部分索引确保这始终正确-但包含它可以使选择器的意图更清楚,并更容易利用查询规划的未来改进(例如,部分索引的自动选择)。

GET /{db}/_index

当你做出一个 GET 请求到 /db/_index ,将获得数据库中所有索引的列表。除了通过此API提供的信息外,索引还存储在设计文档<index functions>中。设计文档是具有以开头的ID的常规文档 _design/ . 设计文档可以像任何其他文档一样被检索和修改,尽管在使用Mango时这不是必需的。

参数
  • db -- 数据库名称。

响应头
响应JSON对象
  • total_rows (number) -- 索引数

  • indexes (object) -- 索引定义数组

状态代码
索引对象的格式:
  • 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 -- 索引名称。

响应头
响应JSON对象
  • ok (string) -- "true" 如果成功。

状态代码

请求

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 -- 数据库名称

请求标头
响应头
响应JSON对象
  • dbname (string) -- 数据库名称

  • index (object) -- 用于完成查询的索引

  • selector (object) -- 使用的查询选择器

  • opts (object) -- 使用的查询选项

  • limit (number) -- 使用的限制参数

  • skip (number) -- 使用的跳过参数

  • fields (array) -- 要由查询返回的字段

  • range (object) -- 传递到基础视图的范围参数

状态代码

请求

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类型索引匹配,则首选索引中字段数最少的索引。如果仍有两个或多个候选索引,则选择具有第一个字母名称的索引。

注解

最好在查询中显式指定索引。这可以防止现有查询受到可能在生产环境中添加的新索引的影响。