couchdb/cloudant 更新处理程序未按预期工作
couchdb/cloudant update handler not working as expected
我正在开发一个使用 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 handlers nor in the couchdb documentation.
中看起来不是这样
如果没有,我该如何解决这个问题,以便更新现有字段?
另外,正如 this question 中的回答,更新处理函数仍然会发生更新冲突,但我该如何避免呢?
提前致谢:)
这是 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
请求的 body 被认为是有效的 JSON,因此您可能需要对 application/json
进行一些 header 检查。
此外,如果您只打算像这里那样做 field = value 的事情,那么 application/x-www-form-url-encoded
会更好,因为它会降低您的有效负载大小和解析时间——CouchDB 和 Cloudant 将 auto-parse 将媒体类型输入 req.form
object.
最后,最好不要在给 CouchDB 或 Cloudant 的任何内容前加上下划线作为前缀,因为它被认为是顶级字段和 _id
值开头的保留字符。 _design/_updateHandler
名称(后来)非常令人困惑...
这里是 JSON 到 copy/paste 到您的数据库中,以获得工作更新功能来执行您想要的操作:
{
"_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
值存储新文档的新文档.
希望对您有所帮助!
我正在开发一个使用 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 handlers nor in the couchdb documentation.
中看起来不是这样如果没有,我该如何解决这个问题,以便更新现有字段? 另外,正如 this question 中的回答,更新处理函数仍然会发生更新冲突,但我该如何避免呢?
提前致谢:)
这是 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
请求的 body 被认为是有效的 JSON,因此您可能需要对 application/json
进行一些 header 检查。
此外,如果您只打算像这里那样做 field = value 的事情,那么 application/x-www-form-url-encoded
会更好,因为它会降低您的有效负载大小和解析时间——CouchDB 和 Cloudant 将 auto-parse 将媒体类型输入 req.form
object.
最后,最好不要在给 CouchDB 或 Cloudant 的任何内容前加上下划线作为前缀,因为它被认为是顶级字段和 _id
值开头的保留字符。 _design/_updateHandler
名称(后来)非常令人困惑...
这里是 JSON 到 copy/paste 到您的数据库中,以获得工作更新功能来执行您想要的操作:
{
"_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
值存储新文档的新文档.
希望对您有所帮助!