1.3.12. /db/_changes
¶
- GET /{db}/_changes¶
返回数据库中对文档进行的更改的排序列表,按应用时间顺序排列,可以从数据库的
_changes
资源中获取。仅保证提供给定文档的最新更改,例如,如果文档添加了字段,然后又删除了字段,则检查更改的 API 客户端不一定能收到添加文档的中间状态。这可用于监听数据库的更新和修改,以便进行后期处理或同步,在实际应用中,持续连接的
_changes
馈送是为大多数应用程序生成实时日志的合理方法。- 参数:
db – 数据库名称
- 请求头:
Accept –
application/json
text/event-stream
text/plain
Last-Event-ID – 服务器在先前连接上接收的最后一个事件的 ID。覆盖
since
查询参数。
- 查询参数:
doc_ids (数组) – 文档 ID 列表,用于将更改馈送过滤为有效的 JSON 数组。与 _doc_ids 过滤器一起使用。由于 URL 长度有限,最好使用
POST /{db}/_changes
代替。conflicts (布尔值) – 在响应中包含 conflicts 信息。如果 include_docs 不是
true
,则忽略。默认值为false
。descending (布尔值) – 按降序排列更改结果(最新更改排在最前面)。默认值为
false
。feed (字符串) –
normal 指定 正常轮询模式。所有过去的更改都会立即返回。默认值。
longpoll 指定 长轮询模式。等待至少发生一次更改,发送更改,然后关闭连接。最常与
since=now
结合使用,以等待下一次更改。continuous 设置 连续模式。每个事件发送一行 JSON。保持套接字打开,直到
timeout
。eventsource 设置 事件源模式。与连续模式的工作方式相同,但以 EventSource 格式发送事件。
filter (字符串) – 对设计文档中的 过滤器函数 的引用,该函数将过滤整个流,仅发出已过滤的事件。有关更多信息,请参阅 《CouchDB 权威指南》一书中的更改通知部分。
heartbeat (数字) – 在结果中发送空行的周期,以毫秒为单位。仅适用于 longpoll、continuous 和 eventsource 馈送。覆盖任何超时,以使馈送无限期地保持活动状态。默认值为
60000
。可以为true
以使用默认值。include_docs (布尔值) – 在每个结果中包含关联的文档。如果有冲突,则仅返回获胜的修订版。默认值为
false
。attachments (布尔值) – 如果
include_docs
为true
,则在包含的文档中包含 附件 的 Base64 编码内容。如果include_docs
不是true
,则忽略。默认值为false
。att_encoding_info (布尔值) – 如果
include_docs
为true
且特定附件已压缩,则在附件存根中包含编码信息。如果include_docs
不是true
,则忽略。默认值为false
。last-event-id (数字) – Last-Event-ID 标头的别名。
limit (数字) – 将结果行数限制为指定的值(注意,在此处使用
0
与使用1
的效果相同)。since – 从给定更新序列后的更改开始返回结果。可以是有效的更新序列或
now
值。默认值为0
。style (字符串) – 指定在更改数组中返回多少个修订版。默认值
main_only
仅返回当前的“获胜”修订版;all_docs
将返回所有叶子修订版(包括冲突和已删除的先前冲突)。timeout (数字) – 在发送响应之前等待更改的最大周期,以毫秒为单位,即使没有结果也是如此。仅适用于 longpoll 或 continuous 馈送。默认值为
chttpd/changes_timeout
配置选项。注意,60000
值也是默认的最大超时,以防止未检测到的死连接。view (字符串) – 允许使用视图函数作为过滤器。如果映射函数为文档发出至少一条记录,则该文档将被计为“通过”视图过滤器。有关更多信息,请参阅 _view。
seq_interval (数字) – 在批量获取更改时,设置seq_interval参数告诉CouchDB仅在返回的每N个结果中计算一次更新序列。通过设置seq_interval=<批次大小>,其中
<批次 大小>
是每个批次请求的结果数量,可以减少源CouchDB数据库的负载;在大量分片的数据库中,跨多个分片计算序列值在负载很重的CouchDB集群中是昂贵的。
- 响应头:
Cache-Control – 如果更改馈送是事件源,则为
no-cache
application/json
text/event-stream
text/plain; charset=utf-8
ETag – 如果更改馈送是正常,则为响应哈希
Transfer-Encoding –
chunked
- 响应JSON对象:
last_seq (json) – 最后一次更改更新序列
pending (数字) – 馈送中剩余项目的数量
results (数组) – 对数据库所做的更改
- 状态代码:
200 OK – 请求已成功完成
400 Bad Request – 错误请求
数据库更改的
results
字段- JSON参数:
changes (数组) – 文档叶子的列表,包含单个字段
rev
。id (字符串) – 文档ID。
seq (json) – 更新序列。
deleted (布尔值) – 如果文档已删除,则为
true
。
请求:
GET /db/_changes?style=all_docs HTTP/1.1 Accept: application/json Host: localhost:5984
响应:
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Mon, 12 Aug 2013 00:54:58 GMT ETag: "6ASLEKEMSRABT0O5XY9UPO9Z" Server: CouchDB (Erlang/OTP) Transfer-Encoding: chunked { "last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i", "pending": 0, "results": [ { "changes": [ { "rev": "2-7051cbe5c8faecd085a3fa619e6e6337" } ], "id": "6478c2ae800dfc387396d14e1fc39626", "seq": "3-g1AAAAG3eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcjfGaQZmaUmmZClM8gZhyAmHGfsG0PICrBPmQC22ZqbGRqamyIqSsLAAArcXo" }, { "changes": [ { "rev": "3-7379b9e515b161226c6559d90c4dc49f" } ], "deleted": true, "id": "5bbc9ca465f1b0fcd62362168a7c8831", "seq": "4-g1AAAAHXeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBMZc4EC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HqQ_kQG3qgSQqnoUtxoYGZkZG5uS4NY8FiDJ0ACkgAbNx2cfROUCiMr9CJ8ZpJkZpaaZEOUziBkHIGbcJ2zbA4hKsA-ZwLaZGhuZmhobYurKAgCz33kh" }, { "changes": [ { "rev": "6-460637e73a6288cb24d532bf91f32969" }, { "rev": "5-eeaa298781f60b7bcae0c91bdedd1b87" } ], "id": "729eb57437745e506b333068fff665ae", "seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA" } ] }
在版本 0.11.0 中更改: 添加了include_docs
参数
在版本 1.2.0 中更改: 添加了view
参数和filter
的特殊值_view
在版本 1.3.0 中更改: since
参数可以取now值,以从当前序列号开始监听更改。
在版本 1.3.0 中更改: 添加了eventsource
馈送类型。
在版本 1.4.0 中更改: 支持Last-Event-ID
头。
在版本 1.6.0 中更改: 添加了attachments
和att_encoding_info
参数
在版本 2.0.0 中更改: 更新序列可以是任何有效的json对象,添加了seq_interval
注意
如果在任何给定since值中,分片的指定副本不可用,则会选择备用副本,并使用它们之间最后已知的检查点。如果发生这种情况,您可能会再次看到以前已经看到的更改。因此,使用_changes
馈送的应用程序应该是“幂等的”,也就是说,能够安全地多次接收相同的数据。
注意
Cloudant Sync和PouchDB通过将seq_interval
参数设置为每个批次预期的结果数量来优化复制过程。此参数通过减少批量文档传输中连续请求之间的延迟来提高吞吐量。这导致高度分片的数据库中复制性能提高了20%。
警告
不建议使用attachments
参数在更改馈送中包含附件,因为附件大小很大。还要注意,使用的Base64编码会导致附件传输大小增加33%(即三分之一)。
警告
_changes返回的结果是部分排序的。换句话说,不能保证多次调用时顺序保持不变。
- POST /{db}/_changes¶
以与
GET /{db}/_changes
相同的方式请求数据库更改馈送,但广泛用于?filter=_doc_ids
查询参数,并允许传递更大的文档ID列表进行过滤。请求:
POST /recipes/_changes?filter=_doc_ids HTTP/1.1 Accept: application/json Content-Length: 40 Content-Type: application/json Host: localhost:5984 { "doc_ids": [ "SpaghettiWithMeatballs" ] }
响应:
HTTP/1.1 200 OK Cache-Control: must-revalidate Content-Type: application/json Date: Sat, 28 Sep 2013 07:23:09 GMT ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2" Server: CouchDB (Erlang OTP) Transfer-Encoding: chunked { "last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV8_o5i", "pending": 0, "results": [ { "changes": [ { "rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e" } ], "id": "SpaghettiWithMeatballs", "seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA" } ] }
1.3.12.1. 更改馈送¶
1.3.12.1.1. 轮询¶
默认情况下,所有更改都会立即在JSON主体中返回
GET /somedatabase/_changes HTTP/1.1
{"results":[
{"seq":"1-g1AAAAF9eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P__7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcTVnkAovI-YZUPICpBvs0CAN1eY_c","id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]},
{"seq":"3-g1AAAAG3eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcjfGaQZmaUmmZClM8gZhyAmHGfsG0PICrBPmQC22ZqbGRqamyIqSsLAAArcXo","id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337CFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA","id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
],
"last_seq":"5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i",
"pending": 0}
results
是按顺序排列的更改列表。新文档和更改的文档仅在rev的值上有所不同;已删除的文档包含"deleted": true
属性。(在style=all_docs mode
中,已删除仅适用于当前/获胜修订版。列出的其他修订版可能已被删除,即使没有已删除属性;您必须GET
它们才能确保。)
last_seq
是返回的最后一次更新的更新序列(等效于结果中的最后一项)。
在查询字符串中发送since
参数将跳过所有更改,直到并包括给定的更新序列
GET /somedatabase/_changes?since=4-g1AAAAHXeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBMZc4EC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HqQ_kQG3qgSQqnoUtxoYGZkZG5uS4NY8FiDJ0ACkgAbNx2cfROUCiMr9CJ8ZpJkZpaaZEOUziBkHIGbcJ2zbA4hKsA-ZwLaZGhuZmhobYurKAgCz33kh HTTP/1.1
normal
和longpoll
模式的返回结构是更改对象的JSON数组和最后一次更新序列。
在continuous
模式的返回格式中,服务器为每个更改发送一个CRLF
(回车符,换行符)分隔的行。每行包含上面描述的JSON对象。
您还可以通过使用include_docs
参数请求每个文档更改的完整内容(而不仅仅是更改通知)。
{
"last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "2-eec205a9d413992850a6e32678485900"
}
],
"deleted": true,
"id": "deleted",
"seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEByD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA",
}
]
}
1.3.12.1.2. 长轮询¶
longpoll馈送(可能最适用于浏览器)是一种更有效的轮询形式,它会在发生更改之前等待响应发送。longpoll避免了频繁轮询CouchDB以发现没有任何更改的需要!
对服务器的请求将保持打开状态,直到数据库发生更改并随后传输,然后连接将关闭。这对服务器和客户端来说都是低负载。
响应基本上与normal馈送发送的JSON相同。
由于等待更改可能很长,因此您可以在连接自动关闭之前设置超时(timeout
参数)。您还可以设置心跳间隔(使用heartbeat
查询参数),它会发送一个换行符以保持连接处于活动状态。
请记住,heartbeat
表示“如果在x
毫秒内没有更改到达,则每x
毫秒发送一个换行符,并无限期地保持连接”,而timeout
表示“保持此连接打开x
毫秒,如果在该时间内没有更改到达,则关闭套接字”。heartbeat
覆盖timeout
。
1.3.12.1.3. 连续¶
持续轮询CouchDB服务器并不理想 - 设置新的HTTP连接只是为了告诉客户端没有任何更改,这会给CouchDB带来不必要的压力。
连续馈送保持打开状态并连接到数据库,直到明确关闭,并且更改会随着发生而发送到客户端,即近乎实时。
与longpoll馈送类型一样,您可以设置超时和心跳间隔,以确保连接保持打开状态以接收新的更改和更新。
请记住,heartbeat
表示“如果在x
毫秒内没有更改到达,则每x
毫秒发送一个换行符,并无限期地保持连接”,而timeout
表示“保持此连接打开x
毫秒,如果在该时间内没有更改到达,则关闭套接字”。heartbeat
覆盖timeout
。
连续馈送的响应与其他馈送类型略有不同,以简化客户端的工作 - 响应的每一行要么为空,要么是表示单个更改的JSON对象,如正常馈送的结果中所见。
如果指定了limit,则馈送将以{ last_seq }对象结束。
GET /somedatabase/_changes?feed=continuous HTTP/1.1
{"seq":"1-g1AAAAF9eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcTVnkAovI-YZUPICpBvs0CAN1eY_c","id":"fresh","changes":[{"rev":"5-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-YjwiMtOdXCwJyU8ICYtABi0n6EnwzSzIxS00yI8hPEjAMQM-5nJTIQUPkAovI_UGUWAA0SgOI","id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}
{"seq":"3-g1AAAAHReJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D660H6ExlwqspjAZIMDUAKqHA-yCZGiEuTUy0MzEnxL8SkBRCT9iPcbJBmZpSaZkKUmyFmHICYcZ-wux9AVIJ8mAUABgp6XQ","id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
... tum tee tum ...
{"seq":"6-g1AAAAIreJyVkEsKwjAURWMrqCOXoCuQ9MU0OrI70XyppcaRY92J7kR3ojupaVNopRQsgRd4yTlwb44QmqahQnN7VjpKImAr7E6Uu4eAI7EoiiJLQx6c3GIiuVJcx93vvQqxdFPsaguqLAY04YwpNLtYpc3RatXPJyW__-EFllst4D_-UPLXmh9VPAaICaEDUtixm-jmLie6N30YqTeYDenDmx7e9GwyYRODNuu_MnnHyzverV6AMkPkAMfHO1rdUAKUkqhLZV-_0o5j","id":"updated","changes":[{"rev":"3-825cb35de44c433bfb2df415563a19de"}]}
显然,… tum tee tum …不会出现在实际响应中,而是表示在发生序列为6的更改之前很长时间的暂停。
1.3.12.1.4. 事件源¶
eventsource馈送提供推送通知,这些通知可以以浏览器中的DOM事件的形式使用。有关更多详细信息,请参阅W3C事件源规范。CouchDB还遵守Last-Event-ID
参数。
GET /somedatabase/_changes?feed=eventsource HTTP/1.1
// define the event handling function
if (window.EventSource) {
var source = new EventSource("/somedatabase/_changes?feed=eventsource");
source.onerror = function(e) {
alert('EventSource failed.');
};
var results = [];
var sourceListener = function(e) {
var data = JSON.parse(e.data);
results.push(data);
};
// start listening for events
source.addEventListener('message', sourceListener, false);
// stop listening for events
source.removeEventListener('message', sourceListener, false);
}
如果您设置了心跳间隔(使用heartbeat
查询参数),CouchDB将发送一个hearbeat
事件,您可以使用以下方法订阅该事件
source.addEventListener('heartbeat', function () {}, false);
客户端应用程序可以监控这一点,以便在需要时重新启动EventSource连接(例如,如果TCP连接卡在半打开状态)。
注意
EventSource连接受跨域资源共享限制。您可能需要配置CORS支持才能使EventSource在您的应用程序中正常工作。
1.3.12.2. 过滤¶
您可以通过多种方式过滤更改馈送的内容。最基本的方法是向查询指定一个或多个文档ID。这会导致返回的结构值仅包含指定ID的更改。请注意,此查询参数的值应为JSON格式的数组。
您也可以通过在设计文档中定义过滤器函数来过滤 _changes
提要。过滤器的规范与复制过滤器的规范相同。您将过滤器函数的名称指定给 filter
参数,并指定设计文档名称和 过滤器名称。例如
GET /db/_changes?filter=design_doc/filtername HTTP/1.1
此外,还提供了一些内置过滤器,如下所述。
1.3.12.2.1. _doc_ids¶
此过滤器仅接受 ID 在 doc_ids
查询参数或有效负载对象数组中指定的文档的更改。有关示例,请参见 POST /{db}/_changes
。
1.3.12.2.2. _selector¶
版本 2.0 中的新增功能。
此过滤器仅接受与指定选择器匹配的文档的更改,该选择器使用与 选择器语法 相同的语法定义,用于 _find。
这比使用 JavaScript 过滤器函数要有效得多,并且是仅根据文档属性进行过滤时的推荐选项。
请注意,与 JavaScript 过滤器不同,选择器无法访问请求对象。
请求:
POST /recipes/_changes?filter=_selector HTTP/1.1
Content-Type: application/json
Host: localhost:5984
{
"selector": { "_id": { "$regex": "^_design/" } }
}
响应:
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 20:03:23 GMT
Etag: "1H8RGBCK3ABY6ACDM7ZSC30QK"
Server: CouchDB (Erlang OTP/18)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "10-304cae84fd862832ea9814f02920d4b2"
}
],
"id": "_design/ingredients",
"seq": "8-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-ZnJTIQULkAonI_ws0GaWZGqWkmRLkZYsYBiBn3Cdv2AKIS7ENWsG2mxkampsaGmLqyAOYpgEo"
},
{
"changes": [
{
"rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817"
}
],
"deleted": true,
"id": "_design/cookbook",
"seq": "9-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D661F8YWBkZGZsbEqCL_JYgCRDA5ACGjQ_K5GBgMoFEJX7EW42SDMzSk0zIcrNEDMOQMy4T9i2BxCVYB-ygm0zNTYyNTU2xNSVBQDnK4BL"
},
{
"changes": [
{
"rev": "6-5b8a52c22580e922e792047cff3618f3"
}
],
"deleted": true,
"id": "_design/meta",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}
1.3.12.2.2.1. 缺少选择器¶
如果请求正文中缺少选择器对象,则错误消息类似于以下示例
{
"error": "bad request",
"reason": "Selector must be specified in POST payload"
}
1.3.12.2.2.2. 不是有效的 JSON 对象¶
如果选择器对象不是格式良好的 JSON 对象,则错误消息类似于以下示例
{
"error": "bad request",
"reason": "Selector error: expected a JSON object"
}
1.3.12.2.2.3. 不是有效的选择器¶
如果选择器对象不包含有效的选择表达式,则错误消息类似于以下示例
{
"error": "bad request",
"reason": "Selector error: expected a JSON object"
}
1.3.12.2.3. _design¶
The _design
过滤器仅接受请求数据库中任何设计文档的更改。
请求:
GET /recipes/_changes?filter=_design HTTP/1.1
Accept: application/json
Host: localhost:5984
响应:
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 12:55:12 GMT
ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
Server: CouchDB (Erlang OTP)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "10-304cae84fd862832ea9814f02920d4b2"
}
],
"id": "_design/ingredients",
"seq": "8-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-ZnJTIQULkAonI_ws0GaWZGqWkmRLkZYsYBiBn3Cdv2AKIS7ENWsG2mxkampsaGmLqyAOYpgEo"
},
{
"changes": [
{
"rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817"
}
],
"deleted": true,
"id": "_design/cookbook",
"seq": "9-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D661F8YWBkZGZsbEqCL_JYgCRDA5ACGjQ_K5GBgMoFEJX7EW42SDMzSk0zIcrNEDMOQMy4T9i2BxCVYB-ygm0zNTYyNTU2xNSVBQDnK4BL"
},
{
"changes": [
{
"rev": "6-5b8a52c22580e922e792047cff3618f3"
}
],
"deleted": true,
"id": "_design/meta",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}
1.3.12.2.4. _view¶
版本 1.2 中的新增功能。
特殊过滤器 _view
允许使用现有的 映射函数 作为 过滤器。如果映射函数为处理的文档发出任何内容,则将其视为已接受,并且更改事件会发出到提要。对于大多数使用实践情况,过滤器 函数与 映射 函数非常相似,因此此功能有助于减少重复代码的数量。
警告
虽然 映射函数 不会处理设计文档,但使用 _view
过滤器会强制它们执行此操作。您需要确保它们已准备好处理具有外来结构的文档,而不会出现恐慌。
注意
使用 _view
过滤器不会查询视图索引文件,因此您无法使用常见的 视图查询参数 通过索引键进一步过滤更改提要。此外,CouchDB 不会像对视图那样立即返回结果 - 它确实使用指定的映射函数作为过滤器。
此外,您无法使此类过滤器动态化,例如处理请求查询参数或处理 用户上下文对象 - 映射函数仅对文档进行操作。
请求:
GET /recipes/_changes?filter=_view&view=ingredients/by_recipe HTTP/1.1
Accept: application/json
Host: localhost:5984
响应:
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 12:57:56 GMT
ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
Server: CouchDB (Erlang OTP)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"results": [
{
"changes": [
{
"rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e"
}
],
"id": "SpaghettiWithMeatballs",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}