Couchdb/Cloudant 更新处理程序未按预期工作

couchdb/cloudant update handler not working as expected

本文关键字:工作 程序 Cloudant 更新 处理 Couchdb      更新时间:2023-09-26

我正在开发一个使用 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 文档中和 couchdb 文档中看起来都不是这样。

如果没有,我该如何解决此问题,以便它确实更新现有字段?此外,正如此问题中所回答的,更新处理程序函数仍然会遇到更新冲突,但如何避免它?

提前致谢:)

这是一个与 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 进行一些标头检查。

此外,如果您只打算像这里一样做字段=值的东西,那么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"}

或者,如果未在请求 URL 中包含文档_id,则会获得一个新文档,该文档使用 req.uuid 值来存储新文档。

希望对您有所帮助!