Couchdb 使用更新处理程序删除文档

Couchdb 使用更新处理程序删除文档,couchdb,Couchdb,我需要从CouchDB中删除一个文档,但首先我需要检查是否满足一个条件。首先想到的是使用一个更新处理程序,手动迭代更新处理程序中的所有键,删除那些没有\u前缀的键,并将\u delete字段设置为true 我想这应该会产生与正常的DELETE相同的结果,对吗 更新: 根据@Kxepal的建议,这是更新处理程序的样子: function (doc, req) { if (req.query.account_id != doc.account_id) { return [doc, '{"

我需要从CouchDB中删除一个文档,但首先我需要检查是否满足一个条件。首先想到的是使用一个更新处理程序,手动迭代更新处理程序中的所有键,删除那些没有
\u
前缀的键,并将
\u delete
字段设置为
true

我想这应该会产生与正常的
DELETE
相同的结果,对吗

更新:

根据@Kxepal的建议,这是更新处理程序的样子:

function (doc, req) {
  if (req.query.account_id != doc.account_id) {
    return [doc, '{"error": "invalid account id"}'];
  }
  return [{
    _id: doc._id,
    _rev: doc._rev,
    _deleted: true
  }, 'ok'];
}
不是真的

当您删除文档时,CouchDB会从文档中删除除
\u id
\u rev
之外的所有字段(当然,
\u deleted
)。此信息也称为
墓碑

当您刚刚将
\u deleted:true
添加到文档时,它将被标记为已删除,但所有其他字段仍然存在:

http--jsonhttp://localhost:5984/recipes/SpaghettiWithMeatballs

HTTP/1.1 404 Object Not Found
Cache-Control: must-revalidate
Content-Length: 41
Content-Type: application/json
Date: Sat, 17 Aug 2013 14:49:17 GMT
Server: CouchDB/1.4.0+build.c843cef (Erlang OTP/R16B)

{
    "error": "not_found", 
    "reason": "deleted"
}
http--jsonhttp://localhost:5984/recipes/SpaghettiWithMeatballs\?版本\=9-ac84157c2206793b7d142f5d8e2c97d0

HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Length: 425
Content-Type: application/json
Date: Sat, 17 Aug 2013 14:48:55 GMT
ETag: "9-ac84157c2206793b7d142f5d8e2c97d0"
Server: CouchDB/1.4.0+build.c843cef (Erlang OTP/R16B)

{
    "_attachments": {
        "my_recipe.txt": {
            "content_type": "text/plain", 
            "digest": "md5-198BPPNiT5fqlLxoYYbjBA==", 
            "length": 85, 
            "revpos": 2, 
            "stub": true
        }
    }, 
    "_deleted": true, 
    "_id": "SpaghettiWithMeatballs", 
    "_rev": "9-ac84157c2206793b7d142f5d8e2c97d0", 
    "description": "An Italian-American dish that usually consists of spaghetti, tomato sauce and meatballs.", 
    "ingredients": [
        "spaghetti", 
        "tomato sauce", 
        "meatballs"
    ], 
    "name": "Spaghetti with meatballs"
}

但是,在压缩过程中,此文档将转换为只包含
\u id
\u rev
\u deleted
字段的
墓碑
。在此之前,这是一个很好的技巧,可以将数据保存在文档中,从而轻松撤消删除操作,而无需请求文档的以前版本,因为所有内容都可用于最新版本。

正如我在问题中提到的:“从文档中删除所有不带前缀的字段”(我在更新处理程序内的循环中手动执行此操作)。您可能会注意到,_附件仍然存在,因此您也必须删除它们。最好创建一个只有墓碑字段的新对象,以节省删除操作的CPU时间。我想这样会更好。