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 (数字) – 在结果中发送空行的周期,以毫秒为单位。仅适用于 longpollcontinuouseventsource 馈送。覆盖任何超时,以使馈送无限期地保持活动状态。默认值为 60000。可以为 true 以使用默认值。

  • include_docs (布尔值) – 在每个结果中包含关联的文档。如果有冲突,则仅返回获胜的修订版。默认值为 false

  • attachments (布尔值) – 如果 include_docstrue,则在包含的文档中包含 附件 的 Base64 编码内容。如果 include_docs 不是 true,则忽略。默认值为 false

  • att_encoding_info (布尔值) – 如果 include_docstrue 且特定附件已压缩,则在附件存根中包含编码信息。如果 include_docs 不是 true,则忽略。默认值为 false

  • last-event-id (数字) – Last-Event-ID 标头的别名。

  • limit (数字) – 将结果行数限制为指定的值(注意,在此处使用 0 与使用 1 的效果相同)。

  • since – 从给定更新序列后的更改开始返回结果。可以是有效的更新序列或 now 值。默认值为 0

  • style (字符串) – 指定在更改数组中返回多少个修订版。默认值 main_only 仅返回当前的“获胜”修订版;all_docs 将返回所有叶子修订版(包括冲突和已删除的先前冲突)。

  • timeout (数字) – 在发送响应之前等待更改的最大周期,以毫秒为单位,即使没有结果也是如此。仅适用于 longpollcontinuous 馈送。默认值为 chttpd/changes_timeout 配置选项。注意,60000 值也是默认的最大超时,以防止未检测到的死连接。

  • view (字符串) – 允许使用视图函数作为过滤器。如果映射函数为文档发出至少一条记录,则该文档将被计为“通过”视图过滤器。有关更多信息,请参阅 _view

  • seq_interval (数字) – 在批量获取更改时,设置seq_interval参数告诉CouchDB仅在返回的每N个结果中计算一次更新序列。通过设置seq_interval=<批次大小>,其中<批次 大小>是每个批次请求的结果数量,可以减少源CouchDB数据库的负载;在大量分片的数据库中,跨多个分片计算序列值在负载很重的CouchDB集群中是昂贵的。

响应头:
响应JSON对象:
  • last_seq (json) – 最后一次更改更新序列

  • pending (数字) – 馈送中剩余项目的数量

  • results (数组) – 对数据库所做的更改

状态代码:

数据库更改的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 中更改: 添加了attachmentsatt_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

normallongpoll模式的返回结构是更改对象的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"
        }
    ]
}