我知道有几个类似的问题(比如这个例如:CouchDB - trigger code when creating or updating document)在CouchDB中引用“更新处理程序”但我无法看到它们如何解决问题;
我在_design / updatehandlers中创建了一个更新处理程序并验证它是否被调用:
"timestampadd" : "function(doc,req) {
if (!doc) {
if ( req.id) {
return [{_id : req.id, timestamp : new Date().getTime()}];
}
return [null,'added empty'];
}
doc.timestamp = new Date().getTime();
return [doc,'added at ' + doc.timestamp];
}"
我的问题是这个;如何在数据库中创建新文档时使用此功能,即我通常通过POST来创建的文档
http://mycouchdb:5984/test_db
我希望couchdb为我创建一个_id(请参阅例如:http://docs.cloudant.com/tutorials/crud/index.html#create)?
如果我按照文档进行操作(在本例中使用Python),我会像这样发布一个帖子;
requests.post("http://mycouchdb:5984/test_db/_design/updatehandlers/_update/timestampadd",headers={'Content-type':'application/json'},data='{"foo":"bar"})
但是这里更新函数timestampadd采用“doc == null&& req.id == null路径”,显然,因为文档尚未创建,我没有指定ID。 这让我相信更新函数只能在现有文档上调用,尽管文档似乎暗示了什么,或者我错了?
我可以在现有文档上调用更新并添加时间戳而没有任何问题,这很有效,但这里的问题是在创建文档时添加时间戳。
甚至可能......?
答案 0 :(得分:4)
是的,您可以使用更新处理程序执行此操作。你走在正确的轨道上。以下是3个案例:
所采用的路径为!doc && !req.id
。
那是你的榜样。您应该构建一个新文档并将其返回,而不是返回null
。您可以使用req.uuid
填充_id
。例如:
return [{_id : req.uuid, timestamp : new Date().getTime()}, 'created new doc'];
所采用的路径为!doc && req.id
。你有这个权利。
所采用的路径为doc
。你有这个权利。
答案 1 :(得分:1)
感谢西蒙指出我正确的方向。这是我最终使用的剧本;
function(doc,req) {
if (!doc) {
var new_doc = {};
if ( req.id) {
new_doc._id = req.id;
} else {
new_doc._id = req.uuid;
}
new_doc.timestamp = new Date().getTime();
new_doc.body = eval('(' + req.body + ')');
return [new_doc,'added new'];
}
doc.timestamp = new Date().getTime(); return [doc,'updated'];
}
请注意,我必须在请求中添加一个“eval”,以便将新文档的内容添加到调用者提供的内容中。