CouchDB - 删除文档
CouchDB - 删除文档
Section titled “CouchDB - 删除文档”在 CouchDB 中,文档在删除后并不会立即从数据库文件中物理移除。相反,会创建一个带有 "_deleted": true 标志的新文档修订版本。这被称为“墓碑(tombstone)”文档。这种方法对于复制(replication)至关重要,它允许删除操作在数据库副本之间正确同步。这些“墓碑”文档会在稍后的数据库压缩(compaction)过程中被永久移除。
_rev 令牌的重要性
Section titled “_rev 令牌的重要性”要删除文档,您必须提供其当前的修订ID(_rev)。这是 CouchDB 多版本并发控制(Multi-Version Concurrency Control,简称MVCC)的一个基本组成部分。它通过确保您删除的是您认为的那个文档版本,从而防止“丢失更新”(lost update)问题。如果在您获取文档和尝试删除文档之间,其他人更新了该文档,您的 _rev 将会过时,操作将失败。
方法一:使用 cURL 工具
Section titled “方法一:使用 cURL 工具”删除文档涉及向文档的URL发送 HTTP DELETE 请求,并将当前的 ?rev= 作为查询参数包含在内。
示例:分步操作
Section titled “示例:分步操作”让我们从名为 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(Web界面)
Section titled “方法二:使用 Fauxton(Web界面)”Fauxton 提供了一种安全且简单的方式来可视化地删除文档。
-
- 在 Fauxton 中,导航到包含您希望删除的文档的数据库。
-
- 点击列表中的文档
_id以打开文档视图。
- 点击列表中的文档
-
- 在文档内容上方的标题栏中,您将看到几个图标。点击垃圾桶图标。
-
- 将弹出一个确认对话框,询问“您确定要删除此文档吗?”。
-
- 点击“删除”(Delete)按钮确认。文档将被删除,您将返回到数据库视图。