IBM Cloud Docs
设计文档的工作方式

设计文档的工作方式

IBM® Cloudant® for IBM Cloud® 将设计文档的特定字段和值作为函数读取。 设计文档用于 构建索引验证更新

每个设计文档都定义由 options.partitioned 字段控制的 分区全局 索引。 分区 索引仅允许对分区数据库中的单个数据分区进行查询。 全局 索引允许查询数据库中的所有数据,其代价是等待时间和对分区索引的吞吐量。

创建或更新设计文档

方法
PUT /$DATABASE/_design/$DDOC
请求
设计文档信息的 JSON。
响应
JSON 状态。
允许的角色
_admin

要创建设计文档,请将其上载到指定的数据库。

在这些示例中, $VARIABLES 可能引用标准文档或设计文档。 为了区分它们,标准文档具有由 $DOCUMENT_ID 指示的 _id,而设计文档具有由 $DDOC 指示的 _id

无论数据库的分区类型如何,设计文档的标识从不包含分区键。 未包含分区键,因为设计文档中包含的索引适用于分区数据库中的所有分区。

如果更新了设计文档,那么 IBM Cloudant 会从先前版本中删除索引,并从头开始重新创建索引。 如果需要更改更大数据库的设计文档,请查看 设计文档管理指南

设计文档的结构包含以下部分:

_id

设计文档标识。 此标识 始终 带有前缀 _design,并且 从不 包含分区键,而不考虑数据库分区类型。

_rev

设计文档修订版。

选项

包含此设计文档的选项。

分区 (可选,布尔值)
确定此设计文档是描述分区索引还是全局索引。 有关更多信息,请参阅 options.partitioned 字段
视图 (可选)

描述 MapReduce 视图的对象。

   `Viewname`
  :  (One for each view) - View Definition.

       Map
         :  Map Function for the view.
减少 (可选)

减少视图的功能。

索引 (可选)

描述搜索索引的对象。

索引名称
(每个索引一个)-索引定义。
分析器
描述要使用的分析器的对象或具有以下字段的对象:
名称

分析器的名称。 有效值为 standardemailkeywordsimplewhitespaceclassicperfield

非索引字 (可选)

停用词数组。 停用词是不得建立索引的词。 如果指定了此数组,那么它将覆盖缺省的停用词列表。 缺省的停用词列表取决于分析器。 The standard analyzer includes the following list of stop words: a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on, or, such, that, the, their, then, there, these, they, this, to, was, will, and with.

缺省值 (针对每个字段分析器)

如果没有为字段指定语言,那么要使用的缺省语言。

字段 (针对每个字段分析器)
一个对象,用于指定要用于分析索引的每个字段的语言。 对象中的字段名与索引中的字段名相对应,即,索引函数的第一个参数。 字段的值是要使用的语言,例如 english
索引
用于处理建立索引的函数。
过滤器 (可选,当 partitionedtrue 时不允许)

过滤函数。

函数名 (每个函数一个)
函数定义。
Validate_doc_update (可选,当 partitionedtrue 时不允许)

更新验证功能。

options.partitioned 字段

此字段设置创建的索引是分区索引还是全局索引。

该字段包括以下值:

options.partitioned字段的值
描述 注释
true 将索引创建为分区索引。 只能在分区数据库中使用。
false 将索引创建为全局索引。 可以在任何数据库中使用。

缺省值遵循数据库的 partitioned 设置:

分区设置
数据库是否已分区? 缺省 partitioned 允许的值
true true, false
false false

复制设计文档

您可以通过指定基本文档和目标文档将设计文档的最新版本复制到新文档。 通过使用 COPY 请求方法来请求副本。

COPY 是非标准 HTTP 命令。

以下示例请求 IBM Cloudant 将设计文档 allusers 复制到新的设计文档 copyOfAllusers,并生成包含新文档的标识和修订版的响应。

复制设计文档不会自动重构视图索引。 与其他视图一样,首次访问新视图时将重新创建这些视图。

请参阅以下示例命令以使用 HTTP 复制设计文档:

COPY $SERVICE_URL/$DATABASE/_design/$DDOC HTTP/1.1
Content-Type: application/json
Destination: _design/$COPY_OF_DDOC

请参阅以下示例命令以复制设计文档:

IBM Cloudant SDK 当前不支持 HTTP COPY 方法。

curl "$SERVICE_URL/users/_design/allusers" \
	-X COPY \
	-H "Content-Type: application/json" \
	-H "Destination: _design/copyOfAllusers"

请参阅以下对复制请求的响应示例:

{
  "ok": true,
  "id": "_design/copyOfAllusers",
  "rev": "1-9c65296036141e575d32ba9c034dd3ee"
}

复制命令的结构

方法
COPY /$DATABASE/_design/$DDOC
请求
无。
响应
描述新文档和修订版的 JSON。
允许的角色
_design

查询参数

自变量

rev

描述
要从中复制的修订版。
可选
需要。
Type
字符串。

HTTP 头

Destination

描述
目标文档 (和可选修订版)
可选
编号

在请求行上指定源设计文档,而请求的 Destination HTTP 头指定目标文档。

从特定修订版复制

要从特定版本复制,请将 rev 参数添加到查询字符串。

新设计文档是使用源文档的指定修订版创建的。

请参阅以下示例命令以使用 HTTP 复制设计文档的特定修订版:

COPY $SERVICE_URL/$DATABASE/_design/$DDOC?rev=$REV HTTP/1.1
Content-Type: application/json
Destination: _design/$COPY_OF_DDOC

请参阅以下示例命令,以使用命令行复制设计文档的特定修订版:

curl "$SERVICE_URL/users/_design/allusers?rev=1-e23b9e942c19e9fb10ff1fde2e50e0f5" \
	-X COPY \
	-H "Content-Type: application/json" \
	-H "Destination: _design/copyOfAllusers"

复制到现有设计文档

要覆盖或复制到现有文档,请使用 Destination HTTP 头字符串的 rev 参数指定目标文档的当前修订字符串。

请参阅以下示例命令以使用 HTTP 覆盖设计文档的现有副本:

COPY $SERVICE_URL/$DATABASE/_design/$DDOC
Content-Type: application/json
Destination: _design/$COPY_OF_DDOC?rev=$REV

请参阅以下示例命令,以使用命令行覆盖设计文档的现有副本:

curl "$SERVICE_URL/users/_design/allusers" \
	-X COPY \
	-H "Content-Type: application/json" \
	-H "Destination: _design/copyOfAllusers?rev=1-9c65296036141e575d32ba9c034dd3ee"

返回值是所复制文档的标识和新修订版。

请参阅以下示例响应以覆盖设计文档的现有副本:

{
  "id" : "_design/copyOfAllusers",
  "rev" : "2-55b6a1b251902a2c249b667dab1c6692"
}

删除设计文档

您可以删除现有设计文档。 删除设计文档还会删除所有关联的视图索引,并为所讨论的索引恢复磁盘上的相应空间。

要成功删除设计文档,必须使用 rev 查询参数指定设计文档的当前修订版。

请参阅以下示例命令以使用 HTTP 删除设计文档:

DELETE $SERVICE_URL/$DATABASE/_design/$DDOC?rev=$REV HTTP/1.1

请参阅以下示例以删除设计文档:

curl "$SERVICE_URL/users/_design/allusers?rev=2-21314508552eceb0e3012429d04575da" -X DELETE
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.delete_design_document(
  db='users',
  ddoc='allusers',
  rev='2-21314508552eceb0e3012429d04575da'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.DeleteDesignDocumentOptions;
import com.ibm.cloud.cloudant.v1.model.DocumentResult;

Cloudant service = Cloudant.newInstance();

DeleteDesignDocumentOptions designDocumentOptions =
    new DeleteDesignDocumentOptions.Builder()
        .db("users")
        .ddoc("allusers")
        .rev("2-21314508552eceb0e3012429d04575da")
        .build();

DocumentResult response =
    service.deleteDesignDocument(designDocumentOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.deleteDesignDocument({
  db: 'users',
  ddoc: 'allusers',
  rev: '2-21314508552eceb0e3012429d04575da'
}).then(response => {
  console.log(response.result);
});
deleteDesignDocumentOptions := service.NewDeleteDesignDocumentOptions(
  "users",
  "allusers",
)
deleteDesignDocumentOptions.SetRev("2-21314508552eceb0e3012429d04575da")

documentResult, response, err := service.DeleteDesignDocument(deleteDesignDocumentOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(documentResult, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)

请参阅包含已删除文档标识和修订版的以下示例响应:

{
  "id": "_design/allusers",
  "ok": true,
  "rev": "3-7a05370bff53186cb5d403f861aca154"
}

delete 命令的结构

方法
DELETE /db/_design/$DDOC
请求
无。
响应
已删除设计文档的 JSON。
允许的角色
_design

查询参数

自变量

rev

描述
用于验证的文档的当前修订版。
可选
是,如果存在 If-Match 头。
Type
字符串。

HTTP 头

If-Match

描述
用于验证的文档的当前修订版。
可选
是,如果存在 rev 查询参数。

视图

设计文档的一个重要用途是用于创建视图。 有关创建视图的更多信息,请参阅 视图(MapReduce)

索引

所有查询都对设计文档中定义的预定义索引执行操作。 这些索引在以下列表中定义:

例如,要创建用于搜索的设计文档,必须确保满足两个条件:

  1. 在使用 _design/ 启动 _id 时,已将该文档定义为设计文档。

  2. 您在文档中创建了 搜索索引 已更新 具有相应字段的文档,或者 已创建 包含搜索索引的新文档。

只要搜索索引设计文档存在并且构建了索引,您就可以使用它进行查询。

关于设计文件中的功能的一般说明

设计文档中的函数在每个文档的多个节点上运行,并且可能运行多次。 为了避免不一致,它们需要是 idempotent,这意味着它们需要在多次运行时或在不同节点上以相同的方式运行。 特别是,不得使用生成随机数或返回当前时间的函数。

过滤器函数

options.partitioned 设置为 true 的设计文档不能包含 filters 字段。

过滤功能是用于过滤 更改订阅源 的设计文档。 它们通过将测试应用于包含在更改订阅源中的每个对象来工作。

如果任何函数测试失败,那么将从订阅源中“除去”或“过滤”对象。 如果该函数在应用于变更时返回 true 结果,那么该变更将保留在订阅源中。 换言之,过滤函数“除去”或“忽略”您不想监视的更改。

过滤器功能还可用于修改 复制任务

过滤器函数需要两个自变量: docreq

doc 参数表示经过过滤测试的文档。

req 参数包含有关请求的更多信息。 通过此参数,您可以创建更动态的过滤器函数,因为它们基于多个因素 (例如,查询参数或用户上下文)。

例如,您可以使用作为 HTTP 请求一部分提供的动态值来控制过滤器功能测试的各个方面。 但是,在许多过滤器函数用例中,仅使用 doc 参数。

请参阅以下包含过滤功能的示例设计文档:

{
	"_id":"_design/example_design_doc",
	"filters": {
		"example_filter": "function (doc, req) { ... }"
	}
}

请参阅下面的过滤器函数示例:

function(doc, req){
	// we need only `mail` documents
	if (doc.type != 'mail'){
		return false;
	}
	// we're interested only in `new` ones
	if (doc.status != 'new'){
		return false;
	}
	return true; // passed!
}

更改订阅源过滤器函数

要将过滤器函数应用于更改订阅源,请在 _changes 查询中包含 filter 参数,并提供要使用的过滤器的名称。

请参阅以下使用 HTTP 应用于 _changes 查询的过滤器函数示例:

POST $SERVICE_URL/$DATABASE/_changes?filter=$DDOC/$FILTER_FUNCTION HTTP/1.1

请参阅应用于 _changes 查询的过滤函数的以下示例:

curl -X POST "$SERVICE_URL/orders/_changes?filter=example_design_doc/example_filter" -H "Content-Type: application/json" -d '{}'
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.post_changes(
  db='orders',
  filter='example_design_doc/example_filter'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ChangesResult;
import com.ibm.cloud.cloudant.v1.model.PostChangesOptions;

Cloudant service = Cloudant.newInstance();

PostChangesOptions changesOptions = new PostChangesOptions.Builder()
    .db("orders")
    .filter("example_design_doc/example_filter")
    .build();

ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.postChanges({
  db: 'orders',
  filter: 'example_design_doc/example_filter'
}).then(response => {
  console.log(response.result);
});
postChangesOptions := service.NewPostChangesOptions(
  "$DATABASE",
)
postChangesOptions.SetFilter("example_design_doc/example_filter")

changesResult, response, err := service.PostChanges(postChangesOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(changesResult, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)

过滤器函数 req 自变量

req 参数允许您使用 query 属性来访问 HTTP 请求的各个方面。

请参阅以下使用 HTTP 提供 req 自变量的示例:

GET $SERVICE_URL/$DATABASE/_changes?filter=$DDOC/$FILTER_FUNCTION&status=new HTTP/1.1

请参阅以下提供 req 参数的示例:

IBM Cloudant SDK 当前不支持 _changes 请求的 status 选项。

curl "$SERVICE_URL/$DATABASE/_changes?filter=$DDOC/$FILTER_FUNCTION&status=new"

请使用提供的 req 参数来查看以下示例过滤器:

function(doc, req){
	// we need only `mail` documents
	if (doc.type != 'mail'){
		return false;
	}
	// we're interested only in `new` ones
	if (doc.status != req.query.status){
		return false;
	}
	return true; // passed!
}

预定义过滤器函数

提供了许多预定义的过滤功能:

_design
仅接受对设计文档的更改。
_doc_ids
仅接受其标识在 doc_ids 参数或提供的 JSON 文档中指定的文档的更改。
_selector
仅接受与使用相同 选择器语法 定义的指定选择器匹配的文档的更改,如用于 _find的“请求”部分中所述。
_view
通过此函数,可以使用现有 映射函数 作为过滤器。

_design 过滤器

_design 过滤器仅接受所请求数据库中的设计文档的更改。

过滤器不需要任何参数。

针对数据库中的 所有 设计文档列出了更改。

请参阅使用 HTTP 的 _design 过滤器的以下示例应用程序:

POST /$DATABASE/_changes?filter=_design HTTP/1.1

请参阅 _design 过滤器的以下示例应用程序:

curl -X POST "$SERVICE_URL/orders/_changes?filter=_design" -H "Content-Type: application/json" -d '{}'
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.post_changes(
  db='orders',
  filter='_design'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ChangesResult;
import com.ibm.cloud.cloudant.v1.model.PostChangesOptions;

Cloudant service = Cloudant.newInstance();

PostChangesOptions changesOptions = new PostChangesOptions.Builder()
    .db("orders")
    .filter("_design")
    .build();

ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.postChanges({
  db: 'orders',
  filter: '_design'
}).then(response => {
  console.log(response.result);
});
postChangesOptions := service.NewPostChangesOptions(
  "$DATABASE",
)
postChangesOptions.SetFilter("_design")

changesResult, response, err := service.PostChanges(postChangesOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(changesResult, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)

应用 _design 过滤器后,请参阅以下示例响应 (缩写):

{
  ...
  "results":[
    {
      "changes":[
        {
          "rev":"10-304...4b2"
        }
      ],
      "id":"_design/ingredients",
      "seq":"8-g1A...gEo"
    },
    {
      "changes":[
        {
          "rev":"123-6f7...817"
        }
      ],
      "deleted":true,
      "id":"_design/cookbook",
      "seq":"9-g1A...4BL"
    },
    ...
  ]
}

_doc_ids 过滤器

_doc-ids 过滤器仅接受具有指定标识的文档的更改。 这些标识在 doc_ids 参数中指定,或者在作为原始请求的一部分提供的 JSON 文档中指定。

请参阅使用 HTTP 的 _doc_ids 过滤器的以下示例应用程序:

POST $SERVICE_URL/$DATABASE/_changes?filter=_doc_ids HTTP/1.1

请参阅 _doc_ids 过滤器的以下示例应用程序:

curl -X POST "$SERVICE_URL/orders/_changes?filter=_doc_ids" -H "Content-Type: application/json" -d '{"doc_ids": ["ExampleID"]}'
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.post_changes(
  db='orders',
  filter='_doc_ids',
  doc_ids=['ExampleID']
).get_result()

print(response)
import java.util.Arrays;

import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ChangesResult;
import com.ibm.cloud.cloudant.v1.model.PostChangesOptions;

Cloudant service = Cloudant.newInstance();

PostChangesOptions changesOptions = new PostChangesOptions.Builder()
    .db("orders")
    .filter("_doc_ids")
    .docIds(Arrays.asList("ExampleID"))
    .build();

ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.postChanges({
  db: 'orders',
  filter: '_doc_ids',
  docIds: ['ExampleID']
}).then(response => {
  console.log(response.result);
});
postChangesOptions := service.NewPostChangesOptions(
  "$DATABASE",
)
postChangesOptions.SetFilter("_doc_ids")
postChangesOptions.SetDocIds([]string{"ExampleID"})

changesResult, response, err := service.PostChanges(postChangesOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(changesResult, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)

请参阅以下示例 JSON 文档,其中列出了过滤期间要匹配的文档标识:

{
  "doc_ids": [
    "ExampleID"
  ]
}

_docs_ids 过滤后,请参阅以下示例响应 (缩写):

{
  "last_seq":"5-g1A...o5i",
  "pending":0,
  "results":[
    {
      "changes":[
        {
          "rev":"13-bcb...29e"
        }
      ],
      "id":"ExampleID",
      "seq":"5-g1A...HaA"
    }
  ]
}

_selector 过滤器

_selector 过滤器仅接受与指定选择器匹配的文档的更改,该选择器是使用用于 _find的相同 选择器语法 定义的。

有关显示使用此过滤器的更多示例,请参阅有关 选择器语法 的信息。

请参阅使用 HTTP 的 _selector 过滤器的以下示例应用程序:

POST $SERVICE_URL/$DATABASE/_changes?filter=_selector HTTP/1.1

请参阅 _selector 过滤器的以下示例应用程序:

curl -X POST "$SERVICE_URL/orders/_changes?filter=_selector" -H "Content-Type: application/json" -d '{"selector": {"_id": { "$regex": "^_design/"}}}'
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.post_changes(
  db='orders',
  filter='_selector',
  selector={'_id': { '$regex': '^_design/'}}
).get_result()

print(response)
import java.util.HashMap;
import java.util.Map;

import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ChangesResult;
import com.ibm.cloud.cloudant.v1.model.PostChangesOptions;

Cloudant service = Cloudant.newInstance();

Map<String, Object> selector = new HashMap<String, Object>();
selector.put("_id", new HashMap<>().put("$regex", "^_design/"));

PostChangesOptions changesOptions = new PostChangesOptions.Builder()
    .db("orders")
    .filter("_selector")
    .selector(selector)
    .build();

ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.postChanges({
    db: 'animaldb',
    filter: '_selector',
    selector: {"_id": { "$regex": "^_design/"}},
  }).then(response => {
    console.log(response.result);
  });
postChangesOptions := service.NewPostChangesOptions(
  "$DATABASE",
)
postChangesOptions.SetFilter("_selector")
postChangesOptions.SetSelector(map[string]interface{}{
  "_id": map[string]string{ "$regex": "^_design/"}})

changesResult, response, err := service.PostChanges(postChangesOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(changesResult, "", "  ")
fmt.Println(string(b))

先前的 Go 示例需要以下导入块:

import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)

请参阅以下示例 JSON 文档,其中包含要在过滤期间使用的选择器表达式:

{
  "selector":{
    "_id":{
      "$regex":"^_design/"
    }
  }
}

使用选择器进行过滤后,请参阅以下示例响应 (缩写):

{
  "last_seq":"11-g1A...OaA",
  "pending":0,
  "results":[
    {
      "changes":[
        {
          "rev":"10-304...4b2"
        }
      ],
      "id":"_design/ingredients",
      "seq":"8-g1A...gEo"
    },
    {
      "changes":[
        {
          "rev":"123-6f7...817"
        }
      ],
      "deleted":true,
      "id":"_design/cookbook",
      "seq":"9-g1A...4BL"
    },
    {
      "changes":[
        {
          "rev":"6-5b8...8f3"
        }
      ],
      "deleted":true,
      "id":"_design/meta",
      "seq":"11-g1A...Hbg"
    }
  ]
}

_view 过滤器

通过使用 _view 过滤器,可以使用现有 映射函数 作为过滤器。

映射函数可能会作为处理特定文档的结果而发出输出。 发生此情况时,过滤器将考虑允许的文档,并将其包含在您更改的文档列表中。

请参阅使用 HTTP 的 _view 过滤器的以下示例应用程序:

POST $SERVICE_URL/$DATABASE/_changes?filter=_view&view=$DDOC/$VIEW_NAME HTTP/1.1

请参阅 _view 过滤器的以下示例应用程序:

curl -X POST "$SERVICE_URL/animaldb/_changes?filter=_view&view=views101/latin_name" -H "Content-Type: application/json" -d '{}'
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.post_changes(
  db='animaldb',
  filter='_view',
  view='views101/latin_name'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.ChangesResult;
import com.ibm.cloud.cloudant.v1.model.PostChangesOptions;

Cloudant service = Cloudant.newInstance();

PostChangesOptions changesOptions = new PostChangesOptions.Builder()
    .db("animaldb")
    .filter("_vew")
    .view("views101/latin_name")
    .build();

ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.postChanges({
  db: 'animaldb',
  filter: '_view',
  view: 'views101/latin_name'
}).then(response => {
  console.log(response.result);
});
postChangesOptions := service.NewPostChangesOptions(
  "animaldb",
)
postChangesOptions.SetFilter("_view")
postChangesOptions.SetView("views101/latin_name")

changesResult, _, err := service.PostChanges(postChangesOptions)
if err != nil {
fmt.Println(err)
}

b, _ := json.MarshalIndent(changesResult, "", "  ")
fmt.Println(string(b))

使用 map 函数进行过滤后,请参阅以下示例响应 (缩写):

{
  "last_seq": "5-g1A...o5i",
  "results": [
    {
      "changes": [
        {
          "rev": "13-bcb...29e"
        }
      ],
      "id": "ExampleID",
      "seq":  "5-g1A...HaA"
    }
  ]
}

更新验证器

options.partitioned 设置为 true 的设计文档不能包含 validate_doc_update 字段。

更新验证器确定在尝试插入和更新时是否必须将文档写入磁盘。 它们不需要查询,因为它们在此过程中隐式运行。 如果拒绝了更改,那么更新验证器将以定制错误进行响应。

更新验证器需要四个参数:

更新验证器的参数
自变量 用途
newDoc 在请求中传递的文档的版本。
oldDoc 当前在数据库中的文档版本,如果不存在,那么为 null
secObj 数据库的 安全对象
userCtx 与当前已认证的用户相关的上下文,例如 nameroles

当管理用户更新设计文档时,更新验证器不适用。 这种做法可确保管理员绝不会意外地锁定自己。

请参阅具有更新验证器的以下示例设计文档:

{
	"_id": "_design/validator_example",
	"validate_doc_update": "function(newDoc, oldDoc, userCtx, secObj) { ... }"
}

请参阅更新验证器的以下示例:

function(newDoc, oldDoc, userCtx, secObj) {
	if (newDoc.address === undefined) {
		throw({forbidden: 'Document must have an address.'});
	}
}

请参阅来自更新验证器的以下示例响应:

{
	"error": "forbidden",
	"reason": "Document must have an address."
}

检索有关设计文档的信息

两个端点为您提供有关设计文档的更多信息: _info_search_info

_info 端点

_info 端点返回有关特定设计文档的信息,包括视图索引,视图索引大小以及设计文档的状态和关联视图索引信息。

方法
GET /db/_design/$DDOC/_info
请求
响应
包含设计文档信息的 JSON。
允许的角色
_reader

请参阅以下使用 HTTP 从 recipes 数据库中检索有关 recipesdd 设计文档的信息的示例:

GET /recipes/_design/recipesdd/_info HTTP/1.1

请参阅以下示例,以从 recipes 数据库中检索有关 recipesdd 设计文档的信息:

curl "$SERVICE_URL/recipes/_design/recipesdd/_info"
getDesignDocumentInformationOptions := service.NewGetDesignDocumentInformationOptions(
  "recipes",
  "recipesdd",
)

designDocumentInformation, response, err := service.GetDesignDocumentInformation(getDesignDocumentInformationOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(designDocumentInformation, "", "  ")
fmt.Println(string(b))
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.get_design_document_information(
  db='recipes',
  ddoc='recipesdd'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.DesignDocumentInformation;
import com.ibm.cloud.cloudant.v1.model.GetDesignDocumentInformationOptions;

Cloudant service = Cloudant.newInstance();

GetDesignDocumentInformationOptions informationOptions =
    new GetDesignDocumentInformationOptions.Builder()
        .db("recipes")
        .ddoc("recipesdd")
        .build();

DesignDocumentInformation response =
    service.getDesignDocumentInformation(informationOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.getDesignDocumentInformation({
  db: 'recipes',
  ddoc: 'recipesdd'
}).then(response => {
  console.log(response.result);
});

JSON 响应包含以下各个字段:

name

设计文档的名称或标识。

view_index

查看索引

compact_running
指示压缩例程是否在视图上运行。
disk_size
存储在磁盘上的视图大小 (以字节为单位)。
language
用于定义视图的语言。
purge_seq
已处理的清除序列。
signature
设计文档的视图的 MD5 特征符。
update_seq
已建立索引的相应数据库的更新顺序。
updater_running
指示是否正在更新视图。
waiting_clients
正在等待此设计文档中的视图的客户机数。
waiting_commit
指示底层数据库是否具有需要处理的未完成落实。

请参阅 JSON 格式的以下示例响应:

{
	"name" : "recipesdd",
	"view_index": {
		"compact_running": false,
		"updater_running": false,
		"language": "javascript",
		"purge_seq": 10,
		"waiting_commit": false,
		"waiting_clients": 0,
		"signature": "fc65594ee76087a3b8c726caf5b40687",
		"update_seq": 375031,
		"disk_size": 16491
	}
}

_search_info 端点

_search_info 端点返回有关特定设计文档中定义的指定搜索的信息。

方法
GET /db/_design/$DDOC/_search_info/yourSearch
请求
响应
包含有关指定搜索的信息的 JSON。
允许的角色 *
_reader

请参阅以下示例,以获取有关使用 HTTP 在存储在 foundbite 数据库中的 app 设计文档内定义的 description 搜索的信息:

GET /foundbite/_design/app/_search_info/description HTTP/1.1

请参阅以下示例,以获取有关 description 搜索索引的信息,该搜索索引是在存储在 foundbite 数据库中的 app 设计文档中定义的:

curl "$SERVICE_URL/foundbite/_design/app/_search_info/description"
from ibmcloudant.cloudant_v1 import CloudantV1

service = CloudantV1.new_instance()

response = service.get_search_info(
  db='foundbite',
  ddoc='app',
  index='description'
).get_result()

print(response)
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.GetSearchInfoOptions;
import com.ibm.cloud.cloudant.v1.model.SearchInfoResult;

Cloudant service = Cloudant.newInstance();

GetSearchInfoOptions infoOptions =
    new GetSearchInfoOptions.Builder()
        .db("foundbite")
        .ddoc("app")
        .index("description")
        .build();

SearchInfoResult response =
    service.getSearchInfo(infoOptions).execute()
        .getResult();

System.out.println(response);
const { CloudantV1 } = require('@ibm-cloud/cloudant');

const service = CloudantV1.newInstance({});

service.getSearchInfo({
  db: 'foundbite',
  ddoc: 'app',
  index: 'description'
}).then(response => {
  console.log(response.result);
});
getSearchInfoOptions := service.NewGetSearchInfoOptions(
  "foundbite",
  "app",
  "description",
)

searchInfoResult, response, err := service.GetSearchInfo(getSearchInfoOptions)
if err != nil {
  panic(err)
}

b, _ := json.MarshalIndent(searchInfoResult, "", "  ")
fmt.Println(string(b))

JSON 结构包含以下各个字段:

name
设计文档中“搜索”的名称或标识。
search_index
搜索索引
pending_seq
在内存和磁盘中达到 Lucene 索引的数据库中的更改序号。
doc_del_count
索引中已删除的文档数。
doc_count
索引中的文件数量。
disk_size
磁盘上索引的大小,以字节为单位。
committed_seq
数据库中落实到磁盘上 Lucene 索引的更改的序号。

请参阅 JSON 格式的以下示例响应:

{
  "name":"_design/app/description",
  "search_index":{
    "pending_seq":63,
    "doc_del_count":3,
    "doc_count":10,
    "disk_size":9244,
    "committed_seq":63
  }
}