CouchDB更新文档

请确认这是我可以用couchDB更新文件的唯一方法;

为了更新文件(让我们称之为fooDoc),我需要通过“_rev”。 因此,我需要通过以下代码(foo.get)获取该文档,然后在callback时,我有“_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];}" } } 

而现在,当我运行下面的代码它不更新,以下是日志:

错误:null respose:将undefined设置为undefined

代码:

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

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

最后更新:哦,我想出了问题; 从这里更新处理程序在这里input链接描述是不正确的; 正确的更新处理程序将是:

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

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

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

您也可以通过查询_all_docs一次获取多个文档的_rev 。 在纳米使用db.list

您也可以执行HEAD请求,通过标题中返回的Etag获取版本ID。 比获取整个文档略less的networkingstream量。

但是,使用这种模式将删除使用修订ID的安全networking,以避免覆盖自从您阅读之后发生的对文档的修改。