使用use_index不起作用的CouchDB _find查询

时间:2017-09-13 00:47:47

标签: couchdb

我正在尝试在CouchDB 2.x中使用类似MongoDB的_find查询:
http://docs.couchdb.org/en/2.1.0/api/database/find.html

通过以下内容,我收到警告,我应该使用索引。

curl -k -X POST "$COUCHDB_HOST/vacation-at-ibm/_find" \
>      -H "Content-Type: application/json" \
>      -w "\nhttp_code=%{http_code}\n" \
>      --data-binary '
> {
>     "selector": {
>         "ownerId": {"$eq": "1A4061897"}
>     }
> }
> '

{"warning":"no matching index found, create an index to optimize query time",

"docs":[
{...}
http_code=200

但是当我添加use_index选项时,我收到一条错误,指出它无法找到我的索引:

curl -k -X POST "$COUCHDB_HOST/vacation-at-ibm/_find" \
>      -H "Content-Type: application/json" \
>      -w "\nhttp_code=%{http_code}\n" \
>      --data-binary '
> {
>     "use_index": [
>         "_design/EventDocument",
>         "events-by-ownerId"
>     ],
>     "selector": {
>         "ownerId": {"$eq": "1A4061897"}
>     }
> }
> '
{"error":"unknown_error","reason":"Unknown Error: mango_idx :: {no_usable_index,no_index_matching_name}"}

我假设我应该指定设计文档密钥和视图名称。但这是一个猜测,因为我发现use_index选项绝对没有有用的文档。没有实际尝试使用它的例子。这是我的设计文档:

{
  "_id": "_design/EventDocument",
  "_rev": "1-115570169dec7d32845c3b7c6e6978fe",
  "language": "javascript",
  "views": {
    "events-by-ownerId": {
      "map": "function(doc) { if (doc.docType == 'event' && doc.ownerId) { var firstDate = null;  if (doc.date) { firstDate = doc.date;  }  emit([doc.ownerId, firstDate], doc); }}"
    }
  }
}

有人知道如何使用此选项吗?我是否使用了错误的设计文档和索引值?

2 个答案:

答案 0 :(得分:2)

因此,当他们说"创建索引" 时,他们会引用/db/_index端点。

您需要通过此流程创建索引。您可以指定要存储索引的位置,否则,CouchDB将创建一个设计文档并将索引存储在那里。

答案 1 :(得分:0)

我也对这个功能感到困惑。要在_find中使用索引,您必须通过_index端点创建Mango语言索引。 use_index字段必须等于包含创建的索引的设计文档的名称,并且不需要前导_design/;如果在创建索引时未指定ddoc,则设计文档的名称将为uuid。如果设计文档some-indexes具有多个索引,则可以将其称为"use_index": "some-indexes/name"。没有设计文档名称,就不能仅通过索引名称来引用索引。即使您指定use_index,也不会使用索引,除非您的查询在索引定义中包含所有fields