CouchDB文档更新处理程序(就地更新)

Jas*_*son 31 couchdb

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

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

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

谢谢

Jas*_*ith 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"}]
Run Code Online (Sandbox Code Playgroud)

(请记住在POST中的JSON对象之后按结束文件^ D).

接下来确认my_doc存在的文件()存在:

curl http://localhost:5984/db/my_doc
# Returns {"_id":"my_doc","_rev":"1-8c9c19a45a7e2dac735005bbe301eb15",
#          "number":23}
Run Code Online (Sandbox Code Playgroud)

现在,您可以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}
Run Code Online (Sandbox Code Playgroud)

请注意,新number值为38,值为23 + 15.