couchdb / cloudant更新处理程序未按预期工作

时间:2016-02-25 14:32:10

标签: javascript couchdb cloudant couchapp

我正在开发一个使用Cloudant作为数据库的应用程序。我有一种情况,我几乎在几乎同时对同一个文档进行两次数据库调用,但是,由于这个原因,我遇到了冲突错误。所以我尝试在cloudant数据库中创建一个更新处理函数,如下所示:

{
  "_id": "_design/_updateHandler",
  "updates": {
    "in-place": "function(doc, req) {
        var field = req.body.field,
        var value= req.body.value,
        var doc[field] = value;
        return [doc, toJSON(doc)];
    }"
  }
}

它在文档中添加了一个字段,但它不会更新它的现有字段。这是预期的行为吗?它在cloudant documentation for update handlerscouchdb documentation中都不是这样。

如果没有,我该如何解决此问题,以便更新现有字段? 另外,正如this question中所回答的那样,更新处理函数仍会产生更新冲突,但我该如何避免它呢?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

以下是与CouchDB和Cloudant兼容的更新功能的一个工作示例,用于执行您更新单个字段后的操作。

function(doc, req) {
  if (!doc) doc = {_id: req.uuid};
  var body = JSON.parse(req.body);
  var field = body.field;
  var value = body.value;
  doc[field] = value;
  return [doc, JSON.stringify(doc)];
}

POST请求的正文被视为有效的JSON,因此您可能希望对application/json执行一些标头检查。

此外,如果您只打算像在这里那样执行field = value,那么application/x-www-form-url-encoded会更好,因为它会降低有效负载大小和解析时间 - CouchDB和Cloudant会自动解析该媒体输入req.form对象。

最后,最好不要使用下划线为CouchDB或Cloudant提供任何前缀,因为它在顶级字段和_id值的开头被视为保留字符。 _design/_updateHandler名称(随后)非常令人困惑......

这里是要复制/粘贴到数据库中的JSON,以获得工作更新功能来执行您想要的操作:

{
    "_id": "_design/overwrite",
    "updates": {
        "in-place": "function(doc, req) {\n  if (!doc) doc = {_id: req.uuid};\n  var body = JSON.parse(req.body);\n  var field = body.field;\n  var value = body.value;\n  doc[field] = value;\n  doc.body = body;\n  return [doc, JSON.stringify(doc)];\n}"
    }
}

要更新现有文档,您需要发出类似此请求的HTTP请求(其中bigbluehat是先前存储的文档的_id:

POST /db/_design/overwrite/_update/in-place/bigbluehat
Content-Type: application/json

{"field": "name", "value": "BigBlueHat"}

或者,如果您未在请求网址中包含文档_id,那么您将获得一个新文档,该文档使用req.uuid值来存储新文档。< / p>

希望有所帮助!