- 数据库
- 文档数据库
- 后端
【免费下载链接】couchdb
Seamless multi-primary syncing database with an intuitive HTTP/JSON API, designed for reliability
导读
CouchDB 是一个以 HTTP/JSON API 为核心的文档型数据库,客户端与服务器之间几乎所有交互——读写文档、查询视图、拉取变更流、发起复制、运行展示函数——都通过 JSON 结构承载。本文以官方JSON Structure Reference附录为骨架,完整收录 CouchDB 中 22 种核心 JSON 对象的全部字段定义与语义说明,并结合本仓库源码(如 couch_db.erl 的get_db_info/1实现、couch_replicator_parse.erl 的复制参数解析逻辑)深入讲解字段背后的实际行为。读完本文,你将能够准确读懂 CouchDB 的各类 API 响应、正确构造文档与复制请求体、理解视图与展示函数的运行时对象模型,并避开常见字段误用陷阱。
数据库与视图的查询响应结构
所有数据库文档列表(All Database Documents)
当查询数据库的_all_docs端点或视图时,返回的顶层 JSON 结构如下:
| 字段 | 说明 |
|---|---|
total_rows | 数据库/视图中的文档总数 |
offset | 文档列表开始时的偏移量(配合skip/startkey使用) |
update_seq(可选) | 数据库当前的更新序列号 |
rows[数组] | 文档对象数组,每个元素描述一条文档 |
该结构是分页遍历数据库与视图索引的基础:total_rows用于估算总量,offset与rows结合可实现键范围扫描。
视图头部信息(View Head Information)
当使用_view端点配合limit=0之类参数仅请求头部时,返回精简结构:
{ "total_rows": 42, "offset": 3 }| 字段 | 说明 |
|---|---|
total_rows | 视图中的文档总数 |
offset | 文档列表开始时的偏移量 |
从源码结构看,total_rows/offset的语义由 B-tree 索引的折叠逻辑支撑(见 couch_btree.erl),视图查询通过 MapReduce 索引(couch_mrview)在查询时计算总行数与起始偏移。
文档读写相关的 JSON 结构
CouchDB 文档对象(CouchDB Document)
单条文档的最小结构,也是所有文档对象的公共骨架:
| 字段 | 说明 |
|---|---|
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID(更新已有文档时必须提供) |
_id用于定位文档,_rev是 CouchDB 实现乐观并发控制(MVCC)的核心:每次更新必须携带当前_rev,否则请求会以冲突错误返回。
批量文档(Bulk Documents)
向_bulk_docs端点提交的请求体:
| 字段 | 说明 |
|---|---|
docs[数组] | 批量文档数组,每个元素是一条文档 |
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID(更新已有文档时使用) |
_deleted(可选) | 是否将文档标记为删除 |
批量写入是高效导入数据的首选方式,每条子文档可携带各自的_id/_rev/_deleted,服务器逐条处理并在响应中回报结果。
批量文档响应(Bulk Document Response)
_bulk_docs返回的响应数组,每条结果对应请求中的一条文档:
| 字段 | 说明 |
|---|---|
docs[数组] | 批量返回的文档对象 |
id | 文档 ID |
error | 错误类型 |
reason | 附带详细原因的错误字符串 |
成功时元素通常为{"id": ..., "ok": true, "rev": ...}形式;失败时则以error/reason形式返回错误详情(如conflict、forbidden)。
CouchDB 错误状态对象(CouchDB Error Status)
| 字段 | 说明 |
|---|---|
id | 文档 ID |
error | 错误类型 |
reason | 附带详细原因的错误字符串 |
这是 CouchDB 错误响应的通用 JSON 形状,出现在文档读写、批量操作等各类失败场景中,客户端应优先解析error字段判断错误类别(如not_found、conflict、unauthorized)。
文档修订与附件结构
带详细修订信息的文档(Detailed Revision Info)
当以?revs_info=true查询文档时返回:
| 字段 | 说明 |
|---|---|
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID |
_revs_info[数组] | 文档扩展修订信息 |
rev | 完整修订字符串 |
status | 修订状态 |
_revs_info数组中的status字段标识每条修订的状态(如available、missing、deleted),用于诊断修订树冲突与清理情况。
带修订历史的文档(Revision Info)
当以?revs=true查询文档时返回:
| 字段 | 说明 |
|---|---|
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID |
_revisions | 文档修订历史对象 |
ids[数组] | 有效修订 ID 数组,按逆序排列(最新在前) |
start | 最新修订的前缀编号 |
_revisions.start+ids组合起来即完整还原文档修订路径:start是最近修订的代数前缀,ids依序对应各代修订哈希,例如3-a..、2-b..、1-c..。
带附件的文档(写入时,Document with Attachments)
向服务器提交含附件的文档时使用:
| 字段 | 说明 |
|---|---|
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID |
_attachments(可选) | 文档附件对象 |
filename | 附件信息(以附件文件名为键) |
content_type | MIME 内容类型字符串 |
data | 附件内容,Base64 编码 |
带附件的文档(返回时,Returned Document with Attachments)
读取文档(如?attachments=true)时返回的附件结构:
| 字段 | 说明 |
|---|---|
_id(可选) | 文档 ID |
_rev(可选) | 修订 ID |
_attachments(可选) | 文档附件对象 |
filename | 附件名称 |
stub | 是否仅为附件存根(stub),布尔值 |
content_type | MIME 内容类型字符串 |
length | 附件数据长度(字节) |
revpos | 该附件存在的修订版本号 |
写入时用data携带 Base64 内容;读取时通常返回stub/length/revpos元数据,配合?attachments=true才能取回实际data。revpos用于判定附件在哪个修订中被引入,是附件去重与增量同步的关键依据。
数据库信息与设计文档结构
CouchDB 数据库信息对象(Database Information Object)
GET /db返回的数据库元信息:
| 字段 | 说明 |
|---|---|
db_name | 数据库名称 |
committed_update_seq | 已提交的更新数 |
doc_count | 数据库中的文档数 |
doc_del_count | 已删除文档数 |
compact_running | 若数据库压缩例程正在运行则为true |
disk_format_version | 数据落盘时使用的物理格式版本 |
disk_size | 磁盘上数据的字节数(不包含视图索引) |
instance_start_time | 数据库打开时间戳,自 epoch 以来的微秒数 |
purge_seq | 数据库上的 purge 操作次数 |
update_seq | 数据库当前的更新序列号 |
该对象的实际生成逻辑可在源码中验证:couch_db.erl 的get_db_info/1通过#db{}记录组装db_name、doc_count、doc_del_count、update_seq、purge_seq、compact_running、instance_start_time、disk_format_version、committed_update_seq等字段。需要特别注意的是,当前版本的实现返回的字段比本文档附录更丰富——还包含engine(存储引擎名)、sizes(含active/disk/external三个字节计数的对象)、compacted_seq、props与uuid,这些可由couch_db_engine:get_size_info/1、get_disk_version/1、get_props/1等调用支撑。因此实际响应中disk_size的语义已被sizes对象取代或并存,解析时建议优先读取sizes。
设计文档(Design Document)
设计文档是以_design/为前缀的特殊文档,定义视图与展示逻辑:
| 字段 | 说明 |
|---|---|
_id | 设计文档 ID(如_design/app) |
_rev | 设计文档修订 |
views | 视图对象 |
viewname | 视图定义(以视图名为键) |
map | 视图的 Map 函数 |
reduce(可选) | 视图的 Reduce 函数 |
设计文档信息(Design Document Information)
GET /db/_design/ddoc/_info返回视图索引运行状态:
| 字段 | 说明 |
|---|---|
name | 设计文档名称/ID |
view_index | 视图索引 |
compact_running | 视图压缩例程当前是否正在运行 |
disk_size | 视图在磁盘上占用的字节数 |
language | 视图定义所用的语言 |
purge_seq | 已处理的 purge 序列 |
signature | 设计文档视图的 MD5 签名 |
update_seq | 已建立索引的对应数据库更新序列 |
updater_running | 视图当前是否正在被更新 |
waiting_clients | 等待该设计文档视图的客户端数量 |
waiting_commit | 是否存在需要处理的对底层数据库的未完成提交 |
signature由视图定义哈希生成,是索引缓存失效判断的核心;updater_running、waiting_clients、waiting_commit则反映索引更新的实时调度状态,可配合监控索引健康度。
变更流与活动任务结构
数据库变更信息(Changes Information)
GET /db/_changes返回的变更流结构:
| 字段 | 说明 |
|---|---|
last_seq | 最后一次更新序列 |
pending | 馈送中剩余条目的数量 |
results[数组] | 对数据库做出的变更列表 |
seq | 更新序列 |
id | 文档 ID |
changes[数组] | 该文档逐字段的变更列表 |
pending仅在非连续模式下有意义,表示当前响应之后还有多少未消费的变更;changes数组内的每个元素形如{"rev": "..."},指明该序列点涉及的修订。连续模式(feed=continuous)下结果流式输出,last_seq用于记录断点以便从since_seq续传。
活动任务列表(List of Active Tasks)
GET /_active_tasks返回当前服务器运行的后台任务:
| 字段 | 说明 |
|---|---|
tasks[数组] | 活动任务数组 |
pid | 进程 ID |
status | 任务状态消息 |
task | 任务名称 |
type | 操作类型 |
type标识任务类别(如database_compaction、view_compaction、replication、indexer),status提供可读的进度描述(如"Progress: 40%"),用于观测压缩、索引构建与复制等后台操作的实时状态。
复制相关 JSON 结构
复制设置(Replication Settings)
写入_replicator数据库或调用POST /_replicate时使用的复制请求体:
| 字段 | 说明 |
|---|---|
source | 源数据库名称或 URL |
target | 目标数据库名称或 URL |
cancel(可选) | 取消复制 |
checkpoint_interval(可选) | 检查点间隔(毫秒) |
continuous(可选) | 配置为连续复制 |
create_target(可选) | 创建目标数据库 |
doc_ids(可选) | 需同步的文档 ID 数组 |
filter(可选) | 过滤器函数名称,形式为ddoc/myfilter |
source_proxy(可选) | 源复制应经过的代理服务器地址 |
target_proxy(可选) | 目标复制应经过的代理服务器地址 |
query_params(可选) | 传给过滤器函数的查询参数,值为包含参数成员的文档 |
selector(可选) | 选择复制中包含的文档;与filter相比有性能优势 |
since_seq(可选) | 复制开始的序列点 |
use_checkpoints(可选) | 是否使用复制检查点 |
winning_revs_only(可选) | 仅复制获胜修订 |
use_bulk_get(可选) | 尝试使用_bulk_get获取修订 |
这些字段的解析与默认值可在 couch_replicator_parse.erl 中验证:default_options/0(第 47-59 行)给出checkpoint_interval默认 30000 毫秒、use_checkpoints默认true、use_bulk_get默认true;convert_options/1(第 338-395 行)则逐一校验各选项类型,例如create_target、winning_revs_only、use_bulk_get必须为布尔值,否则抛出bad_request异常。winning_revs_only的运行时效果可在 couch_replicator_changes_reader.erl 第 46 行 与 couch_replicator_ids.erl 第 115-121 行 看到:开启后会在变更流请求中附加winning_revs_only=true参数,仅拉取每个文档的获胜修订,减少复制流量。selector选项则直接对接 Mango 查询语法,由服务端在源端过滤,避免传输整份变更后再在客户端丢弃。
复制状态(Replication Status)
GET /db/_local/<rep-id>或复制文档状态中返回的结果结构:
| 字段 | 说明 |
|---|---|
ok | 复制状态 |
session_id | 唯一会话 ID |
source_last_seq | 从源数据库读到的最后一个序列号 |
history[数组] | 复制历史 |
session_id | 该次复制操作的会话 ID |
recorded_seq | 最后记录的序列号 |
docs_read | 读取的文档数 |
docs_written | 写入目标的文档数 |
doc_write_failures | 文档写入失败数 |
start_time | 复制操作开始时间 |
start_last_seq | 变更流中的第一个序列号 |
end_time | 复制操作完成时间 |
end_last_seq | 变更流中的最后一个序列号 |
missing_checked | 已检查的缺失文档数 |
missing_found | 发现的缺失文档数 |
bulk_get_attempts | 尝试的_bulk_get获取次数 |
bulk_get_docs | 通过_bulk_get读取的文档数 |
history数组按时间倒序记录每次复制会话的统计,是排查复制吞吐与失败率的核心数据源;missing_checked/missing_found反映修订比对阶段的工作量,bulk_get_attempts/bulk_get_docs则量化_bulk_get批处理带来的效率收益。
视图与展示函数运行时对象
请求对象(Request Object)
展示函数(_show)、列表函数(_list)、更新函数(_update)接收的第一个参数即请求对象:
| 字段 | 说明 |
|---|---|
body | 请求体数据(字符串)。GET请求时值为"undefined";DELETE或HEAD时值为""(空字符串) |
cookie | Cookie 对象 |
form | 表单数据对象。当Content-Type为application/x-www-form-urlencoded时,包含解码后的键值对 |
headers | 请求头对象 |
id | 请求的文档 ID 字符串(若指定),否则为null |
info | 数据库信息对象 |
method | 请求方法字符串或数组。字符串为HEAD、GET、POST、PUT、DELETE、OPTIONS、TRACE之一;否则表示为字符码数组 |
path | 请求路径分段列表 |
peer | 请求来源 IP 地址 |
query | URL 查询参数对象。注意不支持多值键,后出现的键值会覆盖先前的 |
requested_path | 实际请求路径分段列表 |
raw_path | 原始请求路径字符串 |
secObj | 安全对象 |
userCtx | 用户上下文对象 |
uuid | 按配置文件中指定算法生成的 UUID |
一个完整的请求对象示例(来自官方附录):
{ "body": "undefined", "cookie": { "AuthSession": "cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw", "m": "3234" }, "form": {}, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3", "Accept-Encoding": "gzip,deflate,sdch", "Accept-Language": "en-US,en;q=0.8", "Connection": "keep-alive", "Cookie": "m=3234:t|3247:t|6493:t|6967:t|34e2:|18c3:t|2c69:t|5acb:t|ca3:t|c01:t|5e55:t|77cb:t|2a03:t|1d98:t|47ba:t|64b8:t|4a01:t; AuthSession=cm9vdDo1MDZBRjQzRjrfcuikzPRfAn-EA37FmjyfM8G8Lw", "Host": "127.0.0.1:5984", "User-Agent": "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7" }, "id": "foo", "info": { "committed_update_seq": 2701412, "compact_running": false, "db_name": "mailbox", "disk_format_version": 6, "doc_count": 2262757, "doc_del_count": 560, "instance_start_time": "1347601025628957", "purge_seq": 0, "sizes": { "active": 7580843252, "disk": 14325313673, "external": 7803423459 }, "update_seq": 2701412 }, "method": "GET", "path": [ "mailbox", "_design", "request", "_show", "dump", "foo" ], "peer": "127.0.0.1", "query": {}, "raw_path": "/mailbox/_design/request/_show/dump/foo", "requested_path": [ "mailbox", "_design", "request", "_show", "dump", "foo" ], "secObj": { "admins": { "names": [ "Bob" ], "roles": [] }, "members": { "names": [ "Mike", "Alice" ], "roles": [] } }, "userCtx": { "db": "mailbox", "name": "Mike", "roles": [ "user" ] }, "uuid": "3184f9d1ea934e1f81a24c71bde5c168" }注意示例中info对象已体现出现代版本的字段扩展(如sizes对象),与上文get_db_info/1的实现相互印证。
精简请求对象(Request2 Object)
Request2是部分场景下的简化请求对象,字段为Request的子集:
| 字段 | 说明 |
|---|---|
body | 请求体数据(字符串),取值规则同请求对象 |
cookie | Cookie 对象 |
headers | 请求头对象 |
method | 请求方法字符串或数组 |
path | 请求路径分段列表 |
peer | 请求来源 IP 地址 |
query | URL 查询参数对象(不支持多值键) |
requested_path | 实际请求路径分段列表 |
raw_path | 原始请求路径字符串 |
secObj | 安全对象 |
userCtx | 用户上下文对象 |
与完整请求对象的差异在于:Request2不包含form、id、info、uuid字段,适用于不需要表单解析、文档定位或数据库元信息的轻量处理场景。
响应对象(Response Object)
展示/列表函数返回的响应对象:
| 字段 | 说明 |
|---|---|
code | HTTP 状态码(数字) |
json | 可 JSON 编码的对象;隐式将Content-Type头设为application/json |
body | 原始响应文本字符串;隐式将Content-Type头设为text/html; charset=utf-8 |
base64 | Base64 编码字符串;隐式将Content-Type头设为application/binary |
headers | 响应头对象;其中的Content-Type会覆盖任何隐式分配的值 |
stop | 布尔信号,用于停止对视图结果行的迭代(仅列表函数使用) |
官方附录对此结构给出两条重要告诫:
警告:
body、base64与json三个键彼此重叠,后出现的键胜出(last one wins)。由于多数键值对象的实现不保留键顺序,混用时极易出现令人困惑的结果,尽量只使用其中一种。
注意:任何自定义属性都会使 CouchDB 抛出内部异常。此外,响应对象可以是一个简单字符串值,它会被隐式包装为
{"body": ...}对象。
这意味着展示函数应严格遵守字段白名单:要么返回{code, body},要么返回{json: obj},要么直接返回字符串;混用body与json且依赖键序是不可靠的。
安全对象(Security Object)
数据库_security端点使用的权限结构:
| 字段 | 说明 |
|---|---|
admins | 具有管理员权限的角色/用户 |
roles[数组] | 具有父级权限的角色列表 |
names[数组] | 具有父级权限的用户列表 |
members | 具有非管理员权限的角色/用户 |
roles[数组] | 具有父级权限的角色列表 |
names[数组] | 具有父级权限的用户列表 |
{ "admins": { "names": [ "Bob" ], "roles": [] }, "members": { "names": [ "Mike", "Alice" ], "roles": [] } }admins中的用户/角色可执行管理操作(包括修改安全对象本身),members中的用户/角色可读写普通文档。权限校验在 HTTP 层由 couch_httpd_auth.erl 等模块完成,解析secObj后结合用户上下文userCtx决定请求是否放行。
用户上下文对象(User Context Object)
请求对象中的userCtx结构,描述当前请求的认证上下文:
| 字段 | 说明 |
|---|---|
db | 所提供操作上下文中的数据库名称 |
name | 用户名 |
roles | 用户角色列表 |
{ "db": "mailbox", "name": null, "roles": [ "_admin" ] }未认证请求的name为null,匿名用户通常拥有_users角色;管理员用户的roles中会出现_admin。展示与列表函数常依赖userCtx实现基于角色的个性化输出(如按用户过滤可见字段)。
速查要点总结
- 写文档必带
_rev:更新已有文档时遗漏_rev将触发冲突;_bulk_docs批量场景同理。 - 附件写入用
data(Base64),读取看元数据:返回结构中的stub/length/revpos用于判断附件状态与所属修订。 - 数据库信息以
sizes对象为准:现代版本在disk_size之外返回sizes.active/disk/external,解析时优先使用(依据 couch_db.erl 的get_db_info/1)。 - 复制参数有类型校验:
create_target、winning_revs_only、use_bulk_get、use_checkpoints必须为布尔值,checkpoint_interval默认 30000ms(依据 couch_replicator_parse.erl)。 - 响应对象三键互斥:
json/body/base64只用一个,且不得添加自定义属性,否则触发内部异常。 query不支持多值键:重复键时后者覆盖前者,构造 URL 参数需自行避免。
掌握以上 JSON 结构的字段语义,即可准确解析 CouchDB 的一切 HTTP 响应、构造合规的请求体,并在展示函数、复制调度与权限设计中做出正确决策。各结构的字段定义原文位于仓库 src/docs/src/json-structure.rst,可随时对照查阅。
- 数据库
- 文档数据库
- 后端
【免费下载链接】couchdb
Seamless multi-primary syncing database with an intuitive HTTP/JSON API, designed for reliability
相关推荐
CouchDB HTTP/JSON API 参考指南:URL 结构、请求格式与状态码全解
CouchDB HTTP/JSON API 参考指南:URL 结构、请求格式与状态码全解 本文是 CouchDB 官方 API Reference 的深度导读,
数据库文档数据库后端landscape.yml 文件结构深度剖析:云原生项目数据字段完全参考手册
landscape.yml 文件结构深度剖析:云原生项目数据字段完全参考手册 landscape.yml 是 CNCF 云原生交互景观图(Interactive
云原生Bottle 微框架 API 参考:全局函数、请求/响应对象与核心数据结构全解析
Bottle 微框架 API 参考:全局函数、请求/响应对象与核心数据结构全解析 导读 本文是 Bottle 微框架( bottle.py https://li
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考