CouchDB更新文档

CouchDB update document

本文关键字:文档 更新 CouchDB      更新时间:2023-09-26

请确认这是我在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的帮助:所以我一直在关注这份文档;然而,更新处理程序的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];}"
    }
}

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

错误:空响应:将未定义设置为未定义

代码:

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

我真的很感谢你在这方面的帮助

最终更新:哦,我解决了问题;此处的更新处理程序输入此处的链接描述不正确;正确的更新处理程序是:

{
   "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编号的情况下更新文档的唯一方法是通过更新函数。在nano中,使用db.atomic调用更新函数。

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

正如Mike所说,要获得单个文档的_rev,您可以发出HEAD请求。_rev将在ETag标头中。在纳米应用中CCD_ 2。

您还可以通过查询_all_docs一次获取多个文档的_rev。在纳米应用中CCD_ 3。

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

然而,使用此模式确实消除了使用修订ID的安全网,以避免覆盖自您阅读文档以来对文档所做的修改。