CouchDB 更新文档

CouchDB update document

请确认这是我可以在 couchDB 中更新文档的唯一方法;

为了更新文档(我们称之为 fooDoc),我需要传递“_rev”。所以首先我需要通过以下代码 (foo.get) 获取该文档,然后在回调中当我有“_rev”时我可以使用 foo.insert 更新上次修订的文档:

var foo = nano.db.use('foo');
foo.get('fooDoc', function (err, body) {
    console.log("get:", err, body);
    foo.insert({"_id": "fooDoc", "_rev": body['_rev'], "name": "newName", "bar": "baz"}, function (err, body) {
        console.log("insert:", err, body);
    })

});

更新:

感谢 Nuno 的帮助:所以我一直在关注 this documentation;然而,更新处理程序的 json 格式似乎无效 json,因此我更新为以下内容 json:

{
    "updates": {
        "inplace": "function(doc, req) {var field = req.form.field;var value = req.form.value;var message = 'set '+field+' to '+value;doc[field] = value;return [doc, message];}"
    }
}

现在当我运行下面的代码时它没有更新,下面是日志:

error: null respose: set undefined to undefined

代码:

foo.atomic("update", "inplace", "bar6",
        {crazy: true}, function (error, response) {
    console.log("error:", error, "respose:", response)
});

非常感谢你在这方面的帮助

最终更新: 哦,我想通了这个问题;此处 enter link description here 的更新处理程序不正确;正确的更新处理程序是:

{
   "inplace": "function (doc, req) {var message;var body=JSON.parse(req.body);for (id in body) {doc[id] =body[id];message += 'set ', id, 'to', body[id];}return[doc,message];}"
}

在事先不知道 _rev 编号的情况下更新文档的唯一方法是通过 update function。 在 nano 中,使用 db.atomic.

调用更新函数

但您不一定需要获取整个文档,只需获取 _rev。

正如 Mike 所说,要获取单个文档的 _rev,您可以发出 HEAD 请求。 _rev 将在 ETag header 中。在 nano 中使用 db.head.

您还可以通过查询 _all_docs 一次性获取多个文档的 _rev。在 nano 中使用 db.list.

您还可以执行 HEAD 请求,通过 headers 中返回的 Etag 获取修订 ID。网络流量比获取整个文档略少。

但是,使用此模式确实消除了 safety-net 使用修订 ID 以避免覆盖自您阅读文档以来发生的对文档的修改。