http://wiki.apache.org/couchdb/Document_Update_Handlers
CouchDB(0.10及更高版本)现在支持就地更新。我无法理解它是如何工作的。我试图使用提供的示例,但我无法让它工作。
有人可以提供一些示例和用于访问就地更新的uris。
由于
答案 0 :(得分:49)
示例函数in-place
与其他函数中的“就地”更新不同
数据库。 CouchDB仍然使用仅附加架构;文件更新
处理程序仍然会创建新的文档修订等。
尽管如此,更新处理程序非常方便,值得学习。
假设您有一个带累加器的文档。您
想要只用一个HTTP查询在文档中累积一个整数,指定
使用amount
参数的增量金额。请考虑以下命令:
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"}]
(请记住在POST中的JSON对象之后按结束文件^ D。)
接下来确认存在的文件(my_doc
)存在:
curl http://localhost:5984/db/my_doc
# Returns {"_id":"my_doc","_rev":"1-8c9c19a45a7e2dac735005bbe301eb15",
# "number":23}
现在,您可以使用accumulate
参数调用amount
更新处理程序
更新字段。
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}
请注意,新的number
值为38,值为23 + 15。
答案 1 :(得分:4)
这是我在使用上面的例子时发现的非常有用的东西。一旦安装了更新处理程序,就可以使用它来更新更新处理程序本身。例如,如果更新处理程序位于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
。还有更多information on cloning here。由于_revisions
字段可能会变大,因此在响应中删除它对我的用例有意义。使用toJSON(resp)
会将响应作为字符串发回,但成功响应中_rev
的值将是错误的。要获得成功更新的正确修订,请查看响应标头中的X-Couch-Update-NewRev
。更新很可能无法成功并导致冲突as addressed here