【问题标题】:CouchDB Document Update Handlers (in-place updates)CouchDB 文档更新处理程序(就地更新)
【发布时间】:2014-03-26 01:09:48
【问题描述】:

http://wiki.apache.org/couchdb/Document_Update_Handlers

CouchDB(0.10 及更高版本)现在支持就地更新。我很难理解它是如何工作的。我尝试使用提供的示例,但无法正常工作。

有人可以提供一些用于访问就地更新的示例和 uri。

谢谢

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    示例函数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}
    

    现在您可以使用 amount 参数调用 accumulate 更新处理程序以 更新字段。

    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 的值。

    【讨论】:

      【解决方案2】:

      这是我在玩上面的例子时发现的非常有用的东西。安装更新处理程序后,您可以使用它来更新更新处理程序本身。例如,如果您的更新处理程序位于 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

      【讨论】:

        猜你喜欢
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多