2

我可能只是在明显的文档中错过了它,但我无法弄清楚如何使用 CouchRest 检查我的数据库中是否存在文档。

我试过db.get(id)了,但这在我的应用程序中抛出了 404,而且不得不尝试/抓住我的方式似乎有点愚蠢。

有没有一种简单的方法可以说“如果这个 ID 存在 -> 更新,否则 -> 创建”?

4

3 回答 3

2

当您的问题与创建或更新有关时,我建议使用 couchdb更新 API (>=0.10)。像这样设计它:

{
  "updates" : {
    "in_place" : "function(doc, req) {
      var new_doc = null;
      if (req.body) {
        new_doc = JSON.parse(req.body);
      } else {
        return [null, 'No doc given!'];
      }
      if (doc) {
        for(var attr in new_doc) {
          if (attr != '_id' && attr != '_rev') {
            doc[attr] = new_doc[attr];
          }
        }
        return [doc, 'Update OK'];
      } else {
        new_doc['_id'] = new_doc['_id'] || req.uuid;
        return [new_doc, 'Insert OK'];
      }
    }"
  }
}

然后 POST 到$DB/_design/$DESIGN_NAME/_update/in_place或 PUT 到$DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID. 这是一个使用裸机 RestClient 的简单案例,CouchRest 在此基础上构建。

于 2012-03-18T20:12:47.940 回答
2

快速回答 - 不。

基本上,不可能在沙发上保存或更新,因为更新现有文档需要修订号,您需要先获取它才能看到。您需要在此处处理 404。

为了更有帮助,我可能会使用这样的方法:

def save_or_create(db, doc)
  begin
    rev = db.get(doc['_id'])
    doc['_rev'] = rev
    db.save_doc(doc)
  rescue RestClient::ResourceNotFound => nfe
    db.save_doc(doc)
  end
end

未经测试,但应该接近。

于 2010-12-22T03:06:47.400 回答
0

基于先前堆垛机注释的完整功能(我添加 ['_rev'] 到查询):

def save_or_create(db, doc)
    begin
      rev = db.get(doc['_id'])['_rev']
      doc['_rev'] = rev
      db.save_doc(doc)
    rescue RestClient::ResourceNotFound => nfe
      db.save_doc(doc)
    end
end
于 2011-01-22T07:03:54.843 回答