我要做什么:
Ex:这可能是多个测试中学生ID和成绩的分贝。如果数据库中已经存在一个ID,我只想添加到数据库中已经存在的现有测试成绩中,否则创建一个新条目:(ID,成绩)
我在benchdb Wiki中看到以下示例代码:
function(doc, req){
if (!doc){
if ('id' in req && req['id']){
// create new document
return [req, 'New Document'];
}
// change nothing in database
return [null, 'Incorrect data format'];
}
doc[id] = req;
return [doc, 'Edited World!'];
}
此示例中的一些澄清不清楚:我们从哪里获得ID?在添加到db时,通常不会显式传递id。
这是否意味着我们需要显式传递一个名为“ _id”的字段?
答案 0 :(得分:1)
如何检查该ID的数据库,如果是,请决定是添加新条目还是附加。
CouchDB为您执行此操作,假设HTTP客户端使用ID触发您的更新功能。作为documentation describes:
当对更新处理程序的请求在URL中包含文档ID时,服务器将为该功能提供该文档的最新版本
在您发现的示例代码中,更新函数看起来像function(doc, req)
,因此在该函数内部的代码中,变量doc
将具有 existing 文档“在您的CouchDB数据库中。来自客户端/用户的所有传入数据都将找到somewhere within req
。
因此,对于您的情况,它可能类似于:
function(doc, req){
if (doc) {
doc.grades.push(req.form.the_grade);
return [doc, "Added the grade to existing document"];
} else {
var newDoc = {_id:req.uuid, grades:[req.form.the_grade]};
return [newDoc, "Created new document ("+newDoc._id+") for the grade"];
}
}
如果客户对/your_db/_design/your_ddoc/_update/your_update_function/existing_doc_id
进行POST,则if (doc)
的第一部分将被触发,因为您将在{{1 }}变量。如果客户端仅对doc
进行POST,则没有提供/your_db/_design/your_ddoc/_update/your_update_function
,您必须创建一个新的(doc
子句)。
请注意,客户将需要知道ID以更新现有文档。要么跟踪它,要么查找它,或者-如果您必须了解缺点,则使它们根据已知的东西确定。
此外:您提到的else
可能来自CouchDB HTTP客户端库,在任何update / show / list / etc上下文中都不可用(并且不起作用) 。在数据库“自身”中运行沙箱的函数。
答案 1 :(得分:0)
从文档中引用:
如果要更新现有文档,则该文档应该已经设置了_id,并且如果要创建新文档,请确保将其_id设置为根据输入或所提供的req.uuid生成的内容。第二个元素是将发送回给调用方的响应。
因此 tl; dr ,如果未指定_id,请使用req.uuid
。
文档链接:http://docs.couchdb.org/en/stable/ddocs/ddocs.html#update-functions