如何从更新处理程序javascript代码中查询

时间:2018-11-26 05:21:15

标签: javascript couchdb fauxton

我要做什么:

  1. 我想向db添加数据(id,data)。这样做时,我要检查ID是否已经存在,如果存在,请追加到现有数据中。否则添加一个新的(id,数据)条目。

Ex:这可能是多个测试中学生ID和成绩的分贝。如果数据库中已经存在一个ID,我只想添加到数据库中已经存在的现有测试成绩中,否则创建一个新条目:(ID,成绩)

  1. 我已经设置了更新处理程序功能来执行此操作。我了解,默认情况下,couchdb插入不执行上述操作。现在-如何检查该ID的数据库,如果是,请决定是添加新条目还是追加。我知道有db.get()。但是,我认为由于更新处理程序功能已经是db itelf的一部分,因此可能会有更有效的方法。

我在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”的字段?

2 个答案:

答案 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