IBM Cloud Docs
取得資料庫中文件的變更

取得資料庫中文件的變更

GET 要求傳送至 https://$ACCOUNT.cloudant.com/$DATABASE/_changes 會傳回對資料庫中的文件所做的變更清單,包括插入、更新及刪除。

收到 _changes 要求時,會要求資料庫每一個 Shard 各有一個抄本,以提供變更清單。 這些回應會合併並傳回原始要求用戶端。

_changes 端點接受數個選用查詢引數:

_changes 端點的查詢參數
引數 說明 支援的值 預設值
conflicts 只有在 include_docstrue 時才能設定。 將衝突的相關資訊新增至每一份文件。 布林
descending 以循序順序傳回變更。 布林
doc_ids 僅在 filter 設為 _doc_ids 時使用。 過濾資訊來源,以便只傳送對指定文件的變更。 附註: doc_ids 參數僅適用於與 CouchDB 2.0相容的 IBM Cloudant 版本。 如需相關資訊,請參閱 GET / 文件。 文件 ID 的 JSON 陣列
feed 需要的資訊來源類型。 如需相關資訊,請參閱 feed 資訊 "continuous", "longpoll", "normal" "normal"
filter 用來取得更新項目的 過濾函數 名稱。 過濾器定義在 設計文件 中。 string 沒有過濾器。
heartbeat 如果在 feed=longpollfeed=continuous 期間未發生任何變更,則會在此時間 (毫秒) 之後傳送空行。 任何正數 沒有活動訊號
include_docs 併入文件作為結果的一部分。 布林
limit 要傳回的最大行數。 任何非負數
seq_interval 指定 seq 值併入回應的頻率。 設定較高的值,以增加 _changes 的傳輸量並減少回應大小。 附註: 在非連續 _changes 模式中,一律會移入 last_seq 值。 任何正數 1
since 從指定序列 ID 之後的變更開始結果。 如需相關資訊,請參閱 since 資訊 序列 ID 或 now 0
style 指定在 changes 陣列中傳回的修訂數目。 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 資料庫已配送。 它們具有 Shard 及容錯性質。 這些性質表示 _changes 要求所提供的回應可能不同於您預期的行為。

特別是,如果您要求 _since 順序 ID 的變更清單,則會在回應中取得所要求的資訊。 但您也可以取得在序列 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 引數指定預先定義的 過濾函數,以套用至 changes 資訊來源。 此外,還有數個內建過濾器可用:

_design

_design 過濾器只接受設計文件的變更。

_doc_ids

此過濾器只接受 doc_ids 參數中指定其 ID 之文件的變更。

_selector

傳回符合 selector 要求內文參數之文件的變更。 selector 語法_find所用的語法相同。 如果您想要使用選取元過濾器,則必須使用 POST changes 資訊來源 (因為您無法提供具有 GET 要求的文件內文)。 請使用 _selector 方法來過濾,而不使用 _view 過濾方法,因為它更快速且更容易使用。

有關更多信息,請參閱 API 文件

_view

啟用現有 對映函數 作為過濾器。

since 引數

使用 since 引數來取得在指定序列 ID 之後發生的變更清單。 如果 since ID 為 0 (預設值) 或省略,則要求會傳回所有變更。 如果 since ID 為 now,則要求會要求在現行時間之後進行變更。

IBM Cloudant 的分散式本質可能會影響您在回應中取得的結果。 例如,如果您兩次使用相同的 since 序列 ID 來要求變更清單,則結果清單中的變更順序可能不相同。

您也可能看到部分結果似乎來自 since 參數之前。 原因是您可能從 Shard 的不同抄本 (Shard 抄本) 取得結果。

Shard 抄本會自動且持續彼此抄寫,最後具有相同的資料。 不過,在任何時間點,Shard 抄本可能與另一個 Shard 抄本不同,因為它們之間的抄寫尚未完成。

當您要求變更清單時,通常會使用相同的抄本來回應。 但如果保留 Shard 抄本的節點無法使用,系統會替換在另一個節點上保留的對應 Shard 抄本。 為了協助確保您看到所有適用的變更,會使用抄本之間的最新檢查點。 使用檢查點實際上是將變更清單「回復」至最近確認 Shard 抄本彼此同意的時間點。 這個「回復」表示您可能會在「您提供的 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 來取得現行清單。 產生的清單提供使用 since 查詢引數之後續 _changes 清單的起始點。
  • 雖然相同範圍的 Shard 副本包含相同的資料,但其 _changes 歷程通常是唯一的。 此差異是寫入套用至 Shard 的方式的結果。 例如,它們可能以不同的順序套用。 為了確保報告所指定順序的所有變更,可能需要進一步回到 Shard 的歷程,以尋找適當的起始點。 然後會從該起始點報告變更。 這個「回復」可能會出現重複的更新項目,或明顯在指定 since 值之前的更新項目。
  • Shard 所報告的 _changes 一律依順序呈現。 但所有貢獻 Shard 之間的排序可能看起來不同。 如需相關資訊,請參閱 變更資訊來源範例
  • 序列值對於 Shard 而言是唯一的,但在 Shard 之間可能有所不同。 此變異表示如果您有來自不同 Shard 的序列值,則無法假設相同的序列值會參照不同 Shard 內的相同文件。

使用 POST 來取得變更

您也可以使用 POST 來查詢 changes 資訊來源,而不使用 GET。 如果您使用 POST,且使用 docs_idsselector 過濾器,唯一的差異是可以在要求內文中併入 "doc_ids" : [...]"selector": {...} 組件。 所有其他參數都預期在查詢字串中,與使用 GET 相同。

請參閱下列使用 HTTP 來 POST_changes 端點的範例:

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

請參閱下列範例,以 POST_changes 端點:

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}