我可能只是在明显的DOCO中错过了它,但是我无法弄清楚如何使用Couchrest检查DOC是否存在。

我试过了 db.get(id) 但这在我的应用程序中抛出了404,必须尝试/抓住我的方式似乎很愚蠢。

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

有帮助吗?

解决方案

快速答案 - 不。

基本上,由于更新现有文档需要修订号,因此不可能保存或更新在沙发中,您将需要先查看它。您需要在这里处理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

未经测试,但应该接近。

其他提示

我建议使用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'];
      }
    }"
  }
}

然后发布到 $DB/_design/$DESIGN_NAME/_update/in_place 或放在 $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID. 。这是一个简单的案例,使用裸金属静电剂,在其上建造了couchrest。

基于以前的堆栈评论(我将['_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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top