1.3.12. /db/_changes
¶
-
GET
/{db}/_changes
¶ 返回对数据库中文档所做更改的排序列表(按应用程序的时间顺序),可以从数据库的
_changes
资源。仅保证提供给定文档的最新更改,例如,如果文档添加了字段,然后又删除了字段,则检查更改的API客户端不一定会收到添加文档的中间状态。这可以用来监听数据库的更新和修改,以便进行后期处理或同步,并且出于实际目的,可以连续连接
_changes
feed是为大多数应用程序生成实时日志的合理方法。参数: - db -- 数据库名称
请求标头: - Accept --
- application/json
- text/event-stream
- text/plain
- Last-Event-ID -- 服务器在以前的连接上接收的最后一个事件的ID。覆盖
since
查询参数。
查询参数: - doc_ids (array) -- 文档ID列表,用于将更改提要过滤为有效的JSON数组。用于 _doc_ids 过滤器。因为 length of URL is limited ,最好使用 :post:`/{{db}}/_changes` 相反。
- conflicts (boolean) -- 包括 conflicts 回应信息。忽略if include_docs 不是
true
. 默认是false
. - descending (boolean) -- 以降序顺序返回更改结果(最新的更改首先返回)。默认为
false
. - feed (string) --
- 正常的 指定 Normal Polling Mode . 所有过去的更改都会立即返回。 违约。
- 朗波尔 指定 Long Polling Mode . 等待至少发生一个更改,发送更改,然后关闭连接。最常用于与
since=now
,等待下一个更改。 - 连续的 集合 Continuous Mode . 每个事件发送一行JSON。保持插座打开直到
timeout
. - 事件源 集合 Event Source Mode . 工作方式与连续模式相同,但将事件发送到 EventSource 格式。
- filter (string) -- 对a的引用 filter function 来自一个设计文档,它将过滤整个流,只发出经过过滤的事件。参见章节 Change Notifications in the book CouchDB The Definitive Guide 更多信息。
- heartbeat (number) -- 期间 毫秒 然后在结果中发送一个空行。仅适用于 longpoll , continuous 和 eventsource 喂养。重写任何超时以使提要无限期地保持活动状态。默认为
60000
. 可能是true
使用默认值。 - include_docs (boolean) -- 在每个结果中包含相关文档。只有在有冲突的情况下,才返回获胜。默认为
false
. - attachments (boolean) -- 包括的base64编码内容 attachments 在包含以下条件的文档中
include_docs
是true
。如果出现以下情况,则忽略include_docs
不是吗true
。默认值为false
。 - att_encoding_info (boolean) -- 包括在附件存根中编码信息,如果
include_docs
是true
并且该特定附件被压缩。如果出现以下情况,则忽略include_docs
不是吗true
。默认值为false
。 - last-event-id (number) -- Alias Last-Event-ID 标题。
- limit (number) -- 将结果行数限制为指定值(请注意,使用
0
这里的效果和1
) - since -- 在给定的更新序列之后立即启动更改的结果。可以是有效的更新序列或
now
价值观。默认为0
. - style (string) -- 指定在更改数组中返回的修订数。默认值,
main_only
,只返回当前的“中奖”版本;all_docs
将返回所有叶修订(包括冲突和已删除的以前的冲突)。 - timeout (number) -- 最长期限为 毫秒 在发送响应之前等待更改,即使没有结果也是如此。仅适用于 longpoll 或 continuous 馈送。默认值由指定
chttpd/changes_timeout
配置选项。请注意,60000
值也是防止未检测到的死连接的默认最大超时。 - view (string) -- 允许将视图函数用作筛选器。如果映射函数至少为文档发出一条记录,则将文档计数为视图筛选器的“通过”。看到了吗 _view 更多信息。
- seq_interval (number) -- 获取批处理中的更改时,设置 seq_interval 参数告诉CouchDB只计算每个返回第n个结果的update seq。通过设置 seq_interval=<batch size> 在哪里
<batch size>
是每批请求的结果数,在源CouchDB数据库上可以减少负载;在负载很重的CouchDB集群中,跨多个碎片(特别是在高度分片的数据库中)计算seq值非常昂贵。
响应头: - Cache-Control --
no-cache
if changes feed is eventsource - Content-Type --
- application/json
- text/event-stream
- text/plain; charset=utf-8
- ETag -- 如果更改订阅源的响应哈希为 normal
- Transfer-Encoding --
chunked
响应JSON对象: - last_seq (json) -- 上次更改更新序列
- pending (number) -- 源中剩余项的计数
- results (array) -- 对数据库所做的更改
状态代码: - 200 OK -- 请求已成功完成
- 400 Bad Request -- 错误的请求
这个
results
数据库更改字段:JSON对象: - changes (array) -- 单字段文档的叶子列表
rev
. - id (string) -- 文件ID。
- seq (json) -- 更新序列。
- deleted (bool) --
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
参数和特殊值 _view 对于 filter
一
在 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
注解
如果任何给定Sone值中的碎片的指定复制副本不可用,则会选择备用复制副本,并使用它们之间的最后一个已知检查点。如果发生这种情况,您可能会再次看到以前看到的更改。因此,使用 _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
是按顺序排列的更改列表。新文档和更改的文档只在版本值上有所不同;删除的文档包括 "deleted": true
属性。(在 style=all_docs mode
,删除后仅适用于当前/获胜版本。即使没有已删除属性,列出的其他修订也可能被删除;您必须 GET
他们各自来确定。)
last_seq
返回的最后一次更新的更新序列(相当于结果中的最后一项)。
发送 since
查询字符串中的param将跳过到给定更新序列(包括该序列)的所有更改:
GET /somedatabase/_changes?since=4-g1AAAAHXeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBMZc4EC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HqQ_kQG3qgSQqnoUtxoYGZkZG5uS4NY8FiDJ0ACkgAbNx2cfROUCiMr9CJ8ZpJkZpaaZEOUziBkHIGbcJ2zbA4hKsA-ZwLaZGhuZmhobYurKAgCz33kh HTTP/1.1
的返回结构 normal
和 longpoll
modes是一个包含changes对象的JSON数组,以及最后一个更新序列。
的返回格式 continuous
模式下,服务器发送 CRLF
(回车符,换行符)每次更改的分隔线。每行包含 JSON object 如上所述。
您还可以使用 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 feed可能最适用于浏览器,是一种更有效的轮询形式,它在发送响应之前等待发生更改。 longpoll 避免了频繁轮询CouchDB以发现没有任何变化的需要!
对服务器的请求将保持打开状态,直到对数据库进行更改并随后进行传输,然后连接将关闭。这对于服务器和客户端来说都是低负载。
响应基本上与为 normal 喂。
由于等待更改的时间很长,所以可以在自动关闭连接之前设置一个超时( timeout
参数)。您还可以设置心跳间隔(使用 heartbeat
查询参数),它发送新行以保持连接活动。
请记住, heartbeat
表示“发送换行符间隔 x
如果没有变化,请毫秒,并无限期地保持连接“While timeout
表示“保持此连接处于打开状态 x
ms,如果在该时间内没有发生任何更改,则关闭该套接字。“ heartbeat
覆盖 timeout
。
1.3.12.1.3. 连续¶
不断地轮询CouchDB服务器并不理想——设置新的HTTP连接只是为了告诉客户机什么都没有发生,这会给CouchDB带来不必要的压力。
一个连续的feed保持打开并连接到数据库,直到显式关闭,并且在更改发生时将其发送到客户端,即接近实时。
如同 longpoll feed类型您可以设置超时和心跳间隔,以确保连接为新的更改和更新保持打开状态。
请记住, heartbeat
表示“发送换行符间隔 x
如果没有变化,请毫秒,并无限期地保持连接“While timeout
表示“保持此连接处于打开状态 x
ms,如果在该时间内没有发生任何更改,则关闭该套接字。“ 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 ... 不会出现在实际响应中,但表示在发生seq 6更改之前的长时间暂停。
1.3.12.1.4. 事件源¶
这个 eventsource feed provides push notifications that can be consumed in the form of DOM events in the browser. Refer to the W3C eventsource specification 更多细节。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 support 使EventSource在应用程序中工作。
1.3.12.2. 过滤¶
您可以通过多种方式过滤更改提要的内容。最基本的方法是为查询指定一个或多个文档id。这将导致返回的结构值仅包含指定ID的更改。注意,这个查询参数的值应该是JSON格式的数组。
也可以过滤 _changes
通过在设计文档中定义过滤器函数来提供。筛选器的规范与复制筛选器的规范相同。将筛选器函数的名称指定给 filter
参数,指定设计文档名称和 filter name . 例如:
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 新版功能.
此过滤仅接受与使用同一过滤定义的指定选择器匹配的文档的更改 selector syntax 用于 _find 。
这比使用JavaScript过滤器函数要高效得多,如果只对文档属性进行过滤,则建议使用此选项。
注意,与JavaScript过滤器不同,选择器不能访问request对象。
请求 :
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¶
这个 _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
允许使用现有 map function 作为 filter . 如果map函数为已处理的文档发出任何内容,则将其视为已接受,并将changes事件发送到提要。对于大多数用例 filter 函数与 map 所以这个特性有助于减少重复代码的数量。
警告
同时 map functions 不处理设计文档,使用 _view
过滤器迫使他们这样做。你需要确定,他们已经准备好用 外星人 没有恐慌的结构。
注解
使用 _view
filter不查询视图索引文件,因此不能使用common view query parameters 按索引键另外过滤更改提要。另外,CouchDB不会像对视图那样立即返回结果-它实际上使用指定的map函数作为过滤器。
此外,您不能使这些过滤器成为动态的,例如处理请求查询参数或处理 用户上下文对象 -映射功能仅对文档起作用。
请求 :
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"
}
]
}