CouchDB文档更新处理程序(就地更新)

CouchDB文档更新处理程序(就地更新),couchdb,Couchdb,CouchDB(0.10及以上版本)现在支持就地更新。我很难理解它是如何工作的。我尝试使用提供的示例,但无法使其发挥作用 是否有人可以提供一些用于访问就地更新的示例和URI 谢谢示例功能in-place与其他应用程序中的“in-place”更新不同 数据库。CouchDB仍然使用只附加的架构;文件更新 处理程序仍然会创建新的文档修订版等 不过,更新处理程序非常方便,值得学习 假设您有一个带有累加器的文档。你 要仅使用一个HTTP查询在文档中累积整数,请指定 使用金额参数的增量金额。考虑以下命令:

CouchDB(0.10及以上版本)现在支持就地更新。我很难理解它是如何工作的。我尝试使用提供的示例,但无法使其发挥作用

是否有人可以提供一些用于访问就地更新的示例和URI


谢谢

示例功能
in-place
与其他应用程序中的“in-place”更新不同 数据库。CouchDB仍然使用只附加的架构;文件更新 处理程序仍然会创建新的文档修订版等

不过,更新处理程序非常方便,值得学习

假设您有一个带有累加器的文档。你 要仅使用一个HTTP查询在文档中累积整数,请指定 使用
金额
参数的增量金额。考虑以下命令:

curl -X PUT http://localhost:5984/db
# Returns {"ok":true}

curl -H "Content-Type:application/json" -X POST http://localhost:5984/db/_bulk_docs -d @-
{"docs":
  [
    {"_id": "my_doc", "number": 23},
    {"_id": "_design/app",
      "updates": {
        "accumulate": "function (doc, req) {
                         var inc_amount = parseInt(req.query.amount);
                         doc.number = doc.number + inc_amount;
                         return [doc, \"I incremented \" +
                                      doc._id + \" by \" +
                                      inc_amount];
                       }"
      }
    }
  ]
}
# Returns [{"id":"my_doc","rev":"1-8c9c19a45a7e2dac735005bbe301eb15"},
#          {"id":"_design/app","rev":"1-83ec85978d1ed32ee741ce767c83d06e"}]
(请记住在文章中JSON对象之后按文件结尾^D。)

下一步确认累计单据(
myu doc
)存在:

现在,您可以使用
amount
参数调用
accumulate
更新处理程序来 更新字段

curl -X PUT \
 http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=15
# Returns: I incremented my_doc by 15

curl http://localhost:5984/db/my_doc
# Returns {"_id":"my_doc","_rev":"2-<whatever>",
#          "number":38}
curl-X PUT\
http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=15
#返回:我将我的_doc增加了15
卷曲http://localhost:5984/db/my_doc
#返回{“\u id”:“my\u doc”,“\u rev”:“2-”,
#“数字”:38}

请注意,新的
数字
值是38,值是23+15。

在处理上述示例时,我发现这是非常有用的。一旦安装了更新处理程序,就可以使用它来更新更新处理程序本身。例如,如果更新处理程序位于update.json中,则可以执行以下操作:

curl --dump-header - -H "Content-Type:application/json" -X POST http://localhost:5984/db/_design/app/_update/modifyinplace/_design/app -d @update.json
其中update.json包含:

{"_id": "_design/app",
    "updates": {
        "modifyinplace": "function (doc, req) { var fields = JSON.parse(req.body); for (var i in fields) { doc[i] = fields[i] } var resp = eval(uneval(doc)); delete resp._revisions; return [doc, toJSON(resp)]; }"
     }
}
有几件事值得注意。语句
var resp=eval(uneval(doc))
克隆
doc
。还有更多。由于
\u revisions
字段可能会变大,因此在响应中删除它对于我的用例是有意义的。使用
toJSON(resp)
将响应作为字符串发回,但是,成功响应中
\u rev
的值将是错误的。要获得成功更新的正确版本,请查看响应标题中的
X-coach-update-NewRev
。更新很可能不会成功并导致冲突

{"_id": "_design/app",
    "updates": {
        "modifyinplace": "function (doc, req) { var fields = JSON.parse(req.body); for (var i in fields) { doc[i] = fields[i] } var resp = eval(uneval(doc)); delete resp._revisions; return [doc, toJSON(resp)]; }"
     }
}