设计文档的工作方式
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.
- 减少 (可选)
-
减少视图的功能。
- 索引 (可选)
-
描述搜索索引的对象。
- 索引名称
- (每个索引一个)-索引定义。
- 分析器
- 描述要使用的分析器的对象或具有以下字段的对象:
- 名称
-
分析器的名称。 有效值为
standard
,email
,keyword
,simple
,whitespace
,classic
和perfield
。 - 非索引字 (可选)
-
停用词数组。 停用词是不得建立索引的词。 如果指定了此数组,那么它将覆盖缺省的停用词列表。 缺省的停用词列表取决于分析器。 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
, andwith
. - 缺省值 (针对每个字段分析器)
-
如果没有为字段指定语言,那么要使用的缺省语言。
- 字段 (针对每个字段分析器)
- 一个对象,用于指定要用于分析索引的每个字段的语言。 对象中的字段名与索引中的字段名相对应,即,索引函数的第一个参数。 字段的值是要使用的语言,例如
english
。 - 索引
- 用于处理建立索引的函数。
- 过滤器 (可选,当
partitioned
为true
时不允许) -
过滤函数。
- 函数名 (每个函数一个)
- 函数定义。
- Validate_doc_update (可选,当
partitioned
为true
时不允许) -
更新验证功能。
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)。
索引
所有查询都对设计文档中定义的预定义索引执行操作。 这些索引在以下列表中定义:
例如,要创建用于搜索的设计文档,必须确保满足两个条件:
只要搜索索引设计文档存在并且构建了索引,您就可以使用它进行查询。
关于设计文件中的功能的一般说明
设计文档中的函数在每个文档的多个节点上运行,并且可能运行多次。 为了避免不一致,它们需要是 idempotent,这意味着它们需要在多次运行时或在不同节点上以相同的方式运行。 特别是,不得使用生成随机数或返回当前时间的函数。
过滤器函数
options.partitioned
设置为 true
的设计文档不能包含 filters
字段。
过滤功能是用于过滤 更改订阅源 的设计文档。 它们通过将测试应用于包含在更改订阅源中的每个对象来工作。
如果任何函数测试失败,那么将从订阅源中“除去”或“过滤”对象。 如果该函数在应用于变更时返回 true
结果,那么该变更将保留在订阅源中。 换言之,过滤函数“除去”或“忽略”您不想监视的更改。
过滤器功能还可用于修改 复制任务。
过滤器函数需要两个自变量: doc
和 req
。
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 |
与当前已认证的用户相关的上下文,例如 name 和 roles 。 |
当管理用户更新设计文档时,更新验证器不适用。 这种做法可确保管理员绝不会意外地锁定自己。
请参阅具有更新验证器的以下示例设计文档:
{
"_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
}
}