데이터베이스의 문서에 대한 변경사항 가져오기

GET 요청 전송 대상 https://$ACCOUNT.cloudant.com/$DATABASE/_changes에서 삽입, 갱신 및 삭제를 포함하여 데이터베이스의 문서에 대해 작성된 변경사항의 목록을 리턴합니다.

_changes 요청이 수신되면 데이터베이스의 각 샤드에 대한 하나의 복제본에 변경사항 목록을 제공하도록 요청합니다. 이러한 응답은 결합되어 원래 요청 클라이언트로 리턴됩니다.

_changes 엔드포인트에서는 몇 가지 선택적 조회 인수를 승인합니다.

_changes 엔드포인트에 대한 조회 인수
인수 설명 지원되는 값 기본
conflicts include_docs가 true인 경우에만 설정할 수 있습니다. 각각의 문서에 충돌에 대한 정보를 추가합니다. 부울 거짓
descending 순차적으로 변경사항을 리턴합니다. 부울 거짓
doc_ids filter가 _doc_ids로 설정된 경우에만 사용합니다. 지정된 문서에 대한 변경사항만 전송되도록 피드를 필터링합니다. 참고: doc_ids 매개변수는 CouchDB 2.0과 호환 가능한 버전의 IBM Cloudant에서만 작동합니다. 자세한 내용은 GET / 문서를 참조하십시오. 문서 ID의 JSON 배열
feed 필요한 피드의 유형입니다. 자세한 정보는 feed 정보를 참조하십시오. "continuous", "longpoll", "normal" "normal"
filter 업데이트를 가져오기 위해 사용할 filter 함수의 이름입니다. 필터는 디자인 문서에 정의되어 있습니다. string 필터가 없습니다.
heartbeat feed=longpoll 또는 feed=continuous 중에 변경이 수행되지 않은 경우 이 시간(밀리초) 이후 비어 있는 행이 전송됩니다. 양수 하트비트 없음
include_docs 결과의 일부로 문서를 포함시킵니다. 부울 거짓
limit 리턴되는 최대 행 수입니다. 음이 아닌 숫자 없음
seq_interval 응답에 seq 값이 포함되는 빈도를 지정합니다. _changes의 처리량을 늘리고 응답 크기를 줄이려면 더 높은 값을 설정하십시오. 참고: 비연속 _changes 모드에서는 last_seq 값이 항상 채워져 있습니다. 양수 1
since 지정된 순서 ID 이후의 변경사항으로부터 결과를 시작합니다. 자세한 정보는 since 정보를 참조하십시오. 순서 ID 또는 now 0
style 변경사항 배열에서 리턴되는 개정판의 수를 지정합니다. main_only 스타일에서는 현재 "최우선" 개정판만 리턴됩니다. all_docs 스타일에서는 충돌 및 삭제된 이전 충돌을 포함하여 모든 리프 개정판이 리턴됩니다. main_only, all_docs main_only
timeout 이 숫자(밀리초) 동안 데이터를 기다린 후 응답을 중지합니다. heartbeat 설정도 제공되는 경우 해당 설정의 우선순위가 timeout 설정보다 더 높습니다. 양수

include_docs=true를 사용하는 경우 성능상 영향이 발생할 수 있습니다.

다음과 같이 HTTP를 사용하여 데이터베이스의 문서에 대해 작성된 변경사항 목록을 가져오는 예제를 참조하십시오.

GET /$DATABASE/_changes HTTP/1.1

데이터베이스의 문서에 대한 변경사항의 목록을 가져오려면 다음 예제를 참조하십시오.

curl -H "Authorization: Bearer $API_BEARER_TOKEN" -X GET "$SERVICE_URL/orders/_changes?limit=1"

분산 데이터베이스의 변경사항

IBM Cloudant 데이터베이스는 분산되어 있습니다. 이러한 데이터베이스에는 샤드 및 결함 허용 특성이 포함되어 있습니다. 이러한 특성은 _changes 요청을 통해 제공되는 응답이 예상되는 동작과 다를 수 있음을 의미합니다.

특히 특정 순서 ID 이후의(_since) 변경사항 목록을 요청하는 경우 응답에서 요청된 정보를 가져옵니다. 하지만 순서 ID로 표시된 변경사항 이전에 작성된 변경사항을 가져올 수도 있습니다. 이러한 추가 변경사항이 포함된 이유와 애플리케이션에 대한 영향은 복제 안내서에 설명되어 있습니다.

_changes 요청을 사용하는 모든 애플리케이션은 다음 목록에 표시된 것과 같은 변경사항 목록을 올바르게 처리할 수 있어야 합니다.

  • 동일한 정보에 대한 이전 요청과 비교하여 응답에 나열된 변경사항의 순서가 다릅니다.
  • 순서 ID로 식별된 변경사항 이전에 발생한 변경사항입니다.

feed 인수

feed 인수는 IBM Cloudant에서 응답을 전송하는 방법을 변경합니다. By default, _changes 모든 변경 사항을 보고한 후, 연결이 종료됩니다. 이 동작은 feed=normal 인수를 사용하는 것과 동일합니다.

feed=longpoll을 설정하는 경우 변경사항이 보고될 때까지 서버에 대해 전송된 요청이 계속 열려 있게 됩니다. 이 옵션은 변경사항을 지속적으로 모니터링하는 경우에 유용합니다.

feed=continuous 를 설정하면 새 변경사항이 발생할 때 보고됩니다. 이 옵션은 데이터베이스 연결이 한동안 열려 있음을 의미합니다. 응답은 언제든지 종료될 수 있으며 클라이언트는 변경사항을 계속 수신하려면 다시 연결해야 합니다.

연속 응답에 있는 각각의 행은 비어 있거나 단일 변경사항을 나타내는 JSON 오브젝트입니다. 이 옵션을 사용하는 경우 다음과 같은 가이드라인이 충족됩니다.

  • 보고서 항목의 형식은 변경사항의 연속 특성을 반영합니다.
  • JSON 출력의 유효성이 유지됩니다.

다음과 같이 연속 변경사항 피드의 응답 예제(축약됨)를 참조하십시오.

{
	"seq": "1-g1A...qyw",
	"id": "2documentation22d01513-c30f-417b-8c27-56b3c0de12ac",
	"changes": [
		{
			"rev": "1-967a00dff5e02add41819138abb3284d"
		}
	]
},
{
	"seq": "2-g1A...ssQ",
	"id": "1documentation22d01513-c30f-417b-8c27-56b3c0de12ac",
	"changes": [
		{
			"rev": "1-967a00dff5e02add41819138abb3284d"
		}
	]
},
{
	"seq": "3-g1A...qyy",
	"id": "1documentation22d01513-c30f-417b-8c27-56b3c0de12ac",
	"changes": [
		{
			"rev": "2-eec205a9d413992850a6e32678485900"
		}
	],
	"deleted": true
},
{
	"seq": "4-g1A...qyz",
	"id": "2documentation22d01513-c30f-417b-8c27-56b3c0de12ac",
	"changes": [
		{
			"rev": "2-eec205a9d413992850a6e32678485900"
		}
	],
	"deleted": true
}

filter 인수

filter 인수는 변경사항 피드에 적용할 사전정의 filter 함수를 지정합니다. 또한 몇 가지 기본 제공 필터를 사용할 수도 있습니다.

_design

_design 필터는 디자인 문서에 대한 변경 사항만 허용합니다.

_doc_ids

이 필터는 doc_ids 매개변수에 지정된 ID를 가진 문서에 대한 변경 사항만 허용합니다.

_selector

selector 요청 본문 매개변수와 일치하는 문서에 대한 변경 내역을 반환합니다. 선택기 구문 은 _find에 사용되는 구문과 동일합니다. 선택기 필터를 사용하려면 POST 변경 내역 피드를 사용해야 합니다(GET 요청에서는 문서 본문을 전달할 수 없기 때문입니다). _view 필터링 방식 대신 _selector 필터링 방식을 사용하세요. 이 방식이 더 빠르고 사용하기 쉽기 때문입니다.

자세한 정보는 API 문서를 참조하십시오.

_view

기존 맵 기능 을 필터로 사용할 수 있습니다.

since 인수

since 인수를 사용하여 지정된 순서 ID 이후에 발생한 변경사항의 목록을 가져올 수 있습니다. since ID가 0(기본값)이거나 생략되는 경우 요청에서 모든 변경사항을 리턴합니다. since ID가 now인 경우 요청에서 현재 시간 이후에 작성되는 변경사항을 요청합니다.

IBM Cloudant의 분산 특성은 응답에서 가져오는 결과에 영향을 미칠 수 있습니다. 예를 들어 두 번 모두 동일한 since 순서 ID를 사용하여 변경사항 목록을 두 번 요청하는 경우 결과 목록의 변경사항 순서가 동일하지 않을 수도 있습니다.

since 매개변수 이전에 발생한 것으로 보이는 결과가 일부 표시될 수도 있습니다. 그 이유는 샤드(샤드 복제본)의 다른 복제본에서 결과를 가져올 수 있기 때문입니다.

샤드 복제본은 지속적으로 서로 자동 복제되어 결과적으로 동일한 데이터를 보유하게 됩니다. 하지만 특정 시점에는 해당 복제본 간의 복제가 아직 완료되지 않아서 샤드 복제본이 다른 샤드 복제본과 다를 수 있습니다.

변경사항 목록을 요청하는 경우 일반적으로 동일한 복제본을 사용하여 응답합니다. 하지만 샤드 복제본을 보유한 노드를 사용할 수 없는 경우 시스템에서 다른 노드에서 보유한 해당 샤드 복제본을 대체합니다. 적용 가능한 모든 변경사항이 표시되도록 하기 위해 복제본 사이의 최신 체크포인트가 사용됩니다. 체크포인트를 사용하는 경우 샤드 복제본이 서로 일치하는 것으로 확인된 가장 최근 시점으로 변경사항 목록을 효과적으로 "롤백"합니다. 이 "롤백"은 제공된 since 순서 ID "이전"에 수행된 변경사항을 나열하여 확인할 수 있음을 의미합니다.

애플리케이션은 _changes 요청을 여러 번 작성하는 경우 두 번 이상 보고되는 변경사항을 처리할 수 있어야 합니다.

_changes 응답의 동작에 대한 자세한 정보는 복제 안내서를 참조하십시오.

_changes 요청의 응답

_changes 요청의 응답은 데이터베이스 내의 문서에 대해 작성된 변경사항의 목록이 포함된 JSON 오브젝트입니다. 다음 표에서는 개별 필드의 의미에 대해 설명합니다.

_changes에 대한 JSON 오브젝트 응답 필드
필드 설명 유형
changes 특정 문서에 대해 작성된 변경사항의 목록을 나열하는 배열입니다. 배열
deleted 해당 문서가 삭제되었는지 여부를 나타내는 부울입니다. 존재하는 경우 항상 true 값이 포함되어 있어야 합니다. 부울
id 문서 ID입니다. 문자열
last_seq 순서 ID 중에서 마지막 ID입니다. 현재 이 ID는 results에 있는 마지막 항목의 순서 ID와 동일합니다. 문자열
results 데이터베이스에 작성된 변경사항의 배열입니다. 배열
seq 업데이트 순서 ID입니다. 문자열

다음과 같이 _changes 요청에 대한 응답 예제(축약됨)를 참조하십시오.

{
	"results": [
		{
			"seq": "1-g1A...sIg",
			"id": "foo",
			"changes": [
				{
					"rev": "1-967...84d"
				}
			]
		}
	],
	"last_seq": "1-g1A...sIg",
	"pending": 0
}

_changes에 대한 중요한 참고사항

  • _changes에서 리턴되는 결과는 부분적으로 정렬됩니다. 즉, 여러 호출에 대한 순서가 유지되지 않을 수도 있습니다. _changes를 사용하고 last_seq 값을 포함시켜 현재 목록을 가져오도록 결정할 수 있습니다. 결과 목록에서는 _changes 조회 인수를 사용하는 후속 since 목록의 시작점을 제공합니다.
  • 동일한 범위의 샤드 사본에는 동일한 데이터가 포함되지만 해당 _changes 히스토리는 고유한 경우도 있습니다. 이러한 차이점은 샤드에 적용된 쓰기 방법의 결과입니다. 예를 들어 해당 변경사항이 다른 순서로 적용될 수도 있습니다. 모든 변경사항이 지정된 순서로 보고되도록 하려면 샤드의 히스토리로 다시 돌아가서 적절한 시작점을 찾아야 합니다. 이제 시작점으로부터 변경사항이 보고됩니다. 이 "롤백"은 지정된 since 값 이전에 발생한 중복 업데이트의 표시를 제공합니다.
  • 샤드에서 보고하는 _changes는 항상 순서대로 표시됩니다. 하지만 기여하는 모든 샤드 간의 순서 지정은 서로 다를 수 있습니다. 자세한 내용은 ‘변경 내역 피드 예시’를 참조하십시오.
  • 순서 값은 하나의 샤드에 대해 고유하지만 샤드 간에는 서로 달라질 수 있습니다. 이러한 변형은 다른 샤드의 순서 값이 존재하는 경우 동일한 순서 값이 다른 샤드 내에 있는 동일한 문서를 참조한다고 가정할 수 없음을 의미합니다.

POST를 사용하여 변경사항 가져오기

GET 대신 POST를 사용하여 변경사항 피드를 조회할 수도 있습니다. 유일한 차이점은 POST를 사용하면서 docs_ids 또는 selector 필터를 사용하는 경우 요청 본문에 "doc_ids" : [...] 또는 "selector": {...} 파트를 포함시킬 수 있다는 점입니다. 다른 매개변수는 모두 GET을 사용하는 것과 동일하게 조회 문자열에 존재하는 것으로 예상됩니다.

다음과 같이 HTTP를 사용하여 POST 엔드포인트에 게시(_changes)하는 예제를 참조하십시오.

POST /$DATABASE/_changes?filter=_selector HTTP/1.1
Host: $ACCOUNT.cloudant.com
Content-Type: application/json

_changes 엔드포인트에 대한 POST에 대한 다음의 예제를 참조하십시오.

curl -H "Authorization: Bearer $API_BEARER_TOKEN" -X POST "$SERVICE_URL/orders/_changes" -H "Content-Type: application/json"'
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")
    .build();
ChangesResult response =
    service.postChanges(changesOptions).execute()
        .getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postChanges({
  db: 'orders'
}).then(response => {
  console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_changes(
  db='orders'
).get_result()
print(response)
postChangesOptions := service.NewPostChangesOptions(
  "orders",
)
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"
)

모든 Go 예제에서는 service 오브젝트가 초기화되어야 합니다. 자세한 정보는 API 문서 인증 섹션 예제를 참조하십시오.

POST 엔드포인트에 게시(_changes)하는 경우 다음 JSON 오브젝트와 유사한 예제를 참조하십시오.

{"results":[
{"seq":"1-g1AAAA...","id":"0007741142412418284","changes":[{"rev":"1-9d0c2676941ec3a3b3cc2f08fe9a51e0"}]},
{"seq":"2-g1AAAA...","id":"_design/applianceId","changes":[{"rev":"1-b1f67a8b672c1324680d6d7dc1e1fd3c"}]},
...
],
"last_seq":"18-g1AAAA...","pending":0}

페이지 매김

since 매개변수를 북마크처럼 사용하여 변경사항 피드에 페이지 매김을 지정합니다. 구체적인 세부 사항과 예는 API 문서 항목 변경 피드 페이징하기를 참조하세요.