【问题标题】:CouchDB update documentCouchDB 更新文档
【发布时间】:2017-09-15 08:27:16
【问题描述】:

请确认这是我可以在 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);
    })

});

更新:

感谢努诺的帮助:所以我关注了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];}"
    }
}

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

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

代码:

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];}"
}

【问题讨论】:

    标签: javascript node.js couchdb nosql


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢你!我正在使用纳米;我在Nano中没有看到这样的东西,有吗?
    • 更新函数(又名文档更新处理程序)是在设计文档中定义的服务器端函数。 Nano 应该有调用更新函数的能力,但你需要有一个。
    • 非常感谢您的澄清;您能否解释一下 db.atomic 中 designname 的含义?根据文档“使用输入中的指定文档调用设计的更新功能”。这是否意味着我需要在某处定义此更新功能?我如何以及在哪里可以定义它?抱歉,我对 CouchDB 很陌生。非常感谢您的帮助
    • 刚接触Couch,我可以建议您阅读book吗?具体来说,关于design docs 的部分。 TLDR:更新功能存在于数据库中称为设计文档的特殊文档中。在 nano designname 中是您的设计文档/功能的名称。
    • 哦,谢谢你的链接;它有助于理解逻辑;我可以再问你一个简单的问题吗?似乎 npmjs.com/package/... 提到的更新处理程序函数不是有效的 json 格式,所以我对其进行了修改以使其成为有效的 json (请参阅我更新的原始问题)并运行我刚刚更新的相同代码关于我原来的问题;但它没有更新;我非常感谢您的帮助;我刚刚更新了我原来的问题
    【解决方案2】:

    您还可以发出HEAD 请求,通过标头中返回的 Etag 获取修订 ID。与获取整个文档相比,网络流量略少。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多