Skip to content

CouchDB - 删除文档

在 CouchDB 中,文档在删除后并不会立即从数据库文件中物理移除。相反,会创建一个带有 "_deleted": true 标志的新文档修订版本。这被称为“墓碑(tombstone)”文档。这种方法对于复制(replication)至关重要,它允许删除操作在数据库副本之间正确同步。这些“墓碑”文档会在稍后的数据库压缩(compaction)过程中被永久移除。

要删除文档,您必须提供其当前的修订ID(_rev)。这是 CouchDB 多版本并发控制(Multi-Version Concurrency Control,简称MVCC)的一个基本组成部分。它通过确保您删除的是您认为的那个文档版本,从而防止“丢失更新”(lost update)问题。如果在您获取文档和尝试删除文档之间,其他人更新了该文档,您的 _rev 将会过时,操作将失败。

删除文档涉及向文档的URL发送 HTTP DELETE 请求,并将当前的 ?rev= 作为查询参数包含在内。

让我们从名为 inventory 的数据库中删除一个 _id 为 product:101 的文档。

步骤 1:获取文档以获取其当前 _rev。

$ curl -u admin:password -X GET http://127.0.0.1:5984/inventory/product:101
{
"_id": "product:101",
"_rev": "1-b8f65b4f8b9f9b5c2a6f2b3e4d5e6f7a",
"item": "Laptop Stand",
"quantity": 25
}

当前修订版本是 1-b8f65b4f8b9f9b5c2a6f2b3e4d5e6f7a。

步骤 2:使用正确的 _rev 发送 DELETE 请求。

$ curl -u admin:password -X DELETE http://127.0.0.1:5984/inventory/product:101?rev=1-b8f65b4f8b9f9b5c2a6f2b3e4d5e6f7a
{
"ok": true,
"id": "product:101",
"rev": "2-c9a8b7f6e5d4c3b2a1f0e9d8c7b6a5b4"
}

响应表示成功("ok": true),并提供了墓碑文档的新修订ID。

如果您现在尝试获取该文档,CouchDB 将告知您它已被删除。

$ curl -u admin:password -X GET http://127.0.0.1:5984/inventory/product:101
{"error":"not_found","reason":"deleted"}

最常见的错误是提供了不正确或过时的 _rev。在这种情况下,CouchDB 将以 409 Conflict 错误拒绝请求,保护您免受意外删除错误版本文档的风险。

// Attempting to delete with a wrong 'rev' value
$ curl -u admin:password -X DELETE http://127.0.0.1:5984/inventory/product:101?rev=1-WRONG-REV-ID
{"error":"conflict","reason":"Document update conflict."}

Fauxton 提供了一种安全且简单的方式来可视化地删除文档。

    1. 在 Fauxton 中,导航到包含您希望删除的文档的数据库。
    1. 点击列表中的文档 _id 以打开文档视图。
    1. 在文档内容上方的标题栏中,您将看到几个图标。点击垃圾桶图标。
    1. 将弹出一个确认对话框,询问“您确定要删除此文档吗?”。
    1. 点击“删除”(Delete)按钮确认。文档将被删除,您将返回到数据库视图。