디자인 문서 작동 방식

IBM® Cloudant® for IBM Cloud®는 디자인 문서의 특정 필드 및 값을 함수로 읽어들입니다. 디자인 문서는 빌드 인덱스업데이트 유효성 검증에 사용됩니다.

각각의 디자인 문서는 파티셔닝된 인덱스 또는 글로벌 인덱스이며 options.partitioned 필드를 통해 제어됩니다. 파티셔닝된 인덱스의 경우 파티셔닝된 데이터베이스의 단일 데이터 파티션에 대한 조회만 허용합니다. 글로벌 인덱스의 경우 파티셔닝된 인덱스에 대한 대기 시간 및 처리량을 대가로 데이터베이스 내의 모든 데이터에 대한 조회가 허용됩니다.

디자인 문서 작성 또는 업데이트

메소드
PUT /$DATABASE/_design/$DDOC
요청
설계 문서 정보의 JSON.
응답
JSON 상태.
허용되는 역할
_admin

디자인 문서를 작성하려면 지정된 데이터베이스에 해당 문서를 업로드하십시오.

이 예제에서는 $VARIABLES 는 표준 또는 디자인 문서를 참조할 수 있습니다. 이를 구분하기 위해 표준 문서에는 $DOCUMENT_ID로 표시된 _id가 포함된 반면 디자인 문서에는 $DDOC로 표시된 _id가 포함되어 있습니다.

디자인 문서의 ID에는 데이터베이스의 파티션 유형과 관계 없이 파티션 키가 포함되지 않습니다. 디자인 문서 내에 포함된 인덱스는 파티셔닝된 데이터베이스의 모든 파티션에 적용되기 때문에 파티션 키가 포함되지 않습니다.

디자인 문서가 업데이트된 경우 IBM Cloudant에서 이전 버전의 인덱스를 삭제하고 처음부터 인덱스를 다시 작성합니다. 더 큰 데이터베이스용으로 디자인 문서를 변경해야 하는 경우 디자인 문서 관리 안내서를 참조하십시오.

디자인 문서의 구조에는 다음과 같은 파트가 포함되어 있습니다.

_id

디자인 문서 ID. 이 ID는 항상 _design 접두부를 사용하며 데이터베이스 파티션 유형과 관계 없이 절대 파티션 키가 포함되지 않습니다.

_rev

디자인 문서 개정.

옵션

이 설계 문서에 대한 옵션을 포함합니다.

파티션됨(선택 사항, 부울)
이 설계 문서가 파티션 인덱스를 설명하는지, 아니면 전역 인덱스를 설명하는지 여부를 결정합니다. 자세한 정보는 options.partitioned 필드를 참조하십시오.
뷰(선택적)

MapReduce 뷰를 설명하는 오브젝트입니다.

  `Viewname`
 :  (One for each view) - View Definition.
 
      Map
        :  Map Function for the view.
감축(선택적)

뷰에 대한 감축 함수.

인덱스(선택적)

검색 인덱스를 설명하는 오브젝트입니다.

인덱스 이름

(각 인덱스마다 하나씩)- 인덱스 정의.

분석기
사용할 분석기를 설명하는 객체이거나 다음 필드를 가진 객체:
이름

분석기의 이름입니다. 올바른 값은 standard, email, keyword, simple, whitespace, classicperfield입니다.

스톱워드(선택 사항)

중지 단어의 배열입니다. 제외어는 인덱싱하지 않을 단어입니다. 이 배열이 지정된 경우 기본 제외어 목록을 대체합니다. 기본 제외어 목록은 분석기에 따라 달라집니다. 표준 분석기에는 다음과 같은 제외어 목록이 포함되어 있습니다. 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, willwith

기본값(필드별 분석기의 경우)

필드에 언어가 지정되지 않은 경우 사용할 기본 언어입니다.

필드(필드별 분석기용)
인덱스의 각 필드를 분석하는 데 사용할 언어를 지정하는 객체입니다. 오브젝트의 필드 이름은 인덱스의 필드 이름(즉, index 함수의 첫 번째 매개변수)에 해당됩니다. 이 필드의 값은 사용할 언어입니다(예: english).
색인
인덱싱을 처리하는 함수.
필터 (선택 사항, partitioned true``일 때는 허용되지 않음)

필터 기능.

함수 이름 (함수마다 하나씩)
함수 정의.
Validate_doc_update(선택적, partitioned이(가) true인 경우 허용되지 않음)

유효성 검증 기능을 업데이트합니다.

options.partitioned 필드

이 필드에서는 작성된 인덱스가 파티셔닝된 인덱스인지 또는 글로벌 인덱스인지 여부를 설정합니다.

이 필드에는 다음과 같은 값이 포함되어 있습니다.

options.partitioned 필드의 값
설명 참고
true 인덱스를 파티셔닝된 인덱스로 작성합니다. 파티셔닝된 데이터베이스에서만 사용할 수 있습니다.
false 인덱스를 글로벌 인덱스로 작성합니다. 모든 데이터베이스에서 사용할 수 있습니다.

기본값은 데이터베이스에 대한 partitioned 설정을 준수합니다.

파티션 설정
데이터베이스 파티셔닝 여부 기본 partitioned 허용되는 값
true true, false
아니오 false false

디자인 문서 복사

기본 문서 및 대상 문서를 지정하여 최신 버전의 디자인 문서를 새 문서에 복사할 수 있습니다. 이 복사는 COPY 요청 메소드를 사용하여 요청합니다.

COPY HTTP 의 비표준 명령어입니다.

다음 예제에서는 IBM Cloudant가 디자인 문서 allusers를 새 디자인 문서 copyOfAllusers에 복사한 후 새 문서의 ID 및 개정이 포함된 응답을 생성하도록 요청합니다.

디자인 문서를 복사해도 보기 인덱스는 자동으로 재구성되지 않습니다. 다른 보기와 마찬가지로 이러한 보기도 새 보기에 처음으로 액세스할 때 다시 작성됩니다.

다음과 같이 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 명령의 구조

메소드
COPY /$DATABASE/_design/$DDOC
요청
없음.
응답
새 문서 및 개정을 설명하는 JSON.
허용되는 역할
_design

쿼리 인수

인수

rev

설명
복사할 수정본입니다.
선택사항
예.
유형
문자열.

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"

기존 디자인 문서에 복사

기존 문서에 겹쳐쓰거나 복사하려면 rev HTTP 헤더 문자열에 Destination 매개변수를 사용하여 대상 문서에 대한 현재 개정판 문자열을 지정하십시오.

다음과 같이 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 및 새 개정판입니다.

다음과 같이 기존 디자인 문서 사본 겹쳐쓰기에 대한 응답 예제를 참조하십시오.

{
  "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 및 개정판이 포함된 응답 예제를 참조하십시오.

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

delete 명령의 구조

메소드
DELETE /db/_design/$DDOC
요청
없음.
응답
삭제된 디자인 문서의 JSON.
허용되는 역할
_design

쿼리 인수

인수

rev

설명
유효성 검증을 위한 문서의 현재 개정.
선택사항
네, If-Match 헤더가 있다면 그렇습니다.
유형
문자열.

HTTP 헤더

헤더

If-Match

설명
유효성 검증을 위한 문서의 현재 개정.
선택사항
네, rev 쿼리 매개변수가 존재한다면 그렇습니다.

보기

디자인 문서의 중요한 사용법 중 하나는 보기를 작성하기 위한 것입니다. 보기를 작성하는 방법에 대한 자세한 정보는 보기(MapReduce)를 참조하십시오.

인덱스

모든 조회는 디자인 문서에 정의되어 있는 사전정의 인덱스에 대해 작동합니다. 다음 목록에는 이러한 인덱스가 정의되어 있습니다.

예를 들어 검색에 사용되는 디자인 문서를 작성하려면 다음과 같은 두 개의 조건이 true인지 확인해야 합니다.

  1. _id를 사용하여 _design/를 시작할 때 해당 문서를 디자인 문서로 정의했습니다.

  2. 문서 내에서 검색 인덱스를 생성한 후, 해당 필드를 사용하여 문서를 업데이트했거나, 검색 인덱스가 포함된 새 문서를 생성했습니다.

검색 인덱스 디자인 문서가 존재하는 경우 인덱스가 빌드되는 즉시 이를 사용하여 조회를 작성할 수 있습니다.

디자인 문서의 함수에 대한 일반적인 참고사항

디자인 문서의 함수는 복수의 노드에서 각각의 문서에 대해 실행되며 여러 번 실행될 수도 있습니다. 일관성 문제를 방지하기 위해서는, 이들 함수가 이뎀포텐트여야 하며, 즉 여러 번 실행되거나 서로 다른 노드에서 실행될 때 동일한 결과를 내야 합니다. 특히 난수를 생성하거나 현재 시간을 리턴하는 함수를 사용해서는 안됩니다.

Filter 함수

options.partitionedtrue로 설정된 디자인 문서에는 filters 필드를 포함시킬 수 없습니다.

Filter 함수는 변경사항 피드를 필터링하는 디자인 문서입니다. 이러한 함수는 변경사항 피드에 포함된 각각의 오브젝트에 대한 테스트를 적용하여 작동합니다.

임의의 함수 테스트가 실패하는 경우 해당 오브젝트가 피드에서 "제거"되거나 "필터링"됩니다. 변경사항에 적용할 때 함수에서 true 결과를 리턴하는 경우 해당 변경사항이 피드에서 그대로 유지됩니다. 즉, filter 함수는 모니터하지 않을 변경사항을 "제거" 또는 "무시"합니다.

Filter 함수를 사용하여 복제 태스크를 수정할 수도 있습니다.

필터 함수에는 두 개의 인수가 필요합니다: docreq.

doc 인수는 필터링을 위해 테스트되는 문서를 나타냅니다.

req 인수에는 요청에 대한 자세한 정보가 포함되어 있습니다. 이 인수를 사용하는 경우 조회 매개변수 또는 사용자 컨텍스트와 같은 복수의 요소를 기반으로 하기 때문에 더욱 동적인 filter 함수를 작성할 수 있습니다.

예를 들어 HTTP 요청의 일부로 제공되는 동적 값을 사용하여 filter 함수 테스트의 측면을 제어할 수 있습니다. 하지만 많은 filter 함수 유스 케이스에서 doc 매개변수만 사용됩니다.

다음과 같이 filter 함수가 포함된 디자인 문서 예제를 참조하십시오.

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

다음과 같이 filter 함수의 예제를 참조하십시오.

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!
}

피드 필터 기능 변경

변경사항 피드에 filter 함수를 적용하려면 사용할 필터의 이름을 제공하면서 filter 조회에 _changes 매개변수를 포함시키십시오.

HTTP 를 사용하여 _changes 쿼리에 적용되는 필터 함수의 예는 다음과 같습니다:

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

_changes 조회에 filter 함수를 적용하는 다음 예제를 참조하십시오.

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!
}

사전정의 filter 함수

여러 가지 사전정의 filter 함수를 사용할 수 있습니다.

_design
디자인 문서에 대한 변경사항만 승인합니다.
_doc_ids
doc_ids 매개변수 또는 제공된 JSON 문서에 ID가 지정된 문서의 변경사항만 허용합니다.
_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 필터는 지정된 ID의 문서에 대한 변경사항만 승인합니다. 이 ID는 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"
)

다음과 같이 필터링 중에 일치시킬 문서 ID를 나열하는 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 필터를 사용하는 경우 기존 map 함수를 필터로 사용할 수 있습니다.

map 함수는 특정 문서를 처리한 결과로 출력을 생성할 수 있습니다. 이러한 상황이 발생하는 경우 필터에서 허용되는 문서로 간주하여 변경한 문서 목록에 포함시킵니다.

다음과 같이 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.partitionedtrue로 설정된 디자인 문서에는 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를 사용하여 recipesdd 데이터베이스 내에서 recipes 디자인 문서에 대한 정보를 검색하는 예제를 참조하십시오.

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

디자인 문서의 이름 또는 ID.

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를 사용하여 description 데이터베이스에 저장된 app 디자인 문서 내에 정의되어 있는 foundbite 검색에 대한 정보를 가져오는 예제를 참조하십시오.

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

foundbite 데이터베이스에 저장된 app 디자인 문서에 정의되어 있는 description 검색 인덱스에 대한 정보를 가져오는 다음 예제를 참조하십시오.

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
설계 문서 내에서 검색의 이름 또는 ID입니다.
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
  }
}