如何更新pouchDB文档中的单个字段

时间:2014-05-12 09:59:24

标签: javascript pouchdb

我使用“_id”,“name”和“status”字段创建一个pouchDB文档。但是,我发现如果我想更新文档的“status”字段,那么我还需要指定我不会改变的所有其他字段,否则它们会被删除。也就是说,如果我在更新时没有指定“名称”字段,则文档上将不再有“名称”字段。

function createFriendSchedule(friend){

  pouchDB.put({

    _id : friend['id'],
    name : friend['name'],
    status: "new"

  }, function(err, response){

    createAndDispatchEvent("friend Schedule created");

  });


}

这是更新文件的代码

function changeFriendStatus(friend){

  pouchDB.get(friend['id'], function(err, retrieved){

    pouchDB.put({

      _id : friend['id'],
      _rev : retrieved._rev, //need to specify _rev otherwise conflict will occur
      name : retrieved.name, //if you don't specify name should remain the samme as before, then it will be left off the record!
      status : friend['status']

    }, function(err, response){

      if(err){  

    console.log("COULDN'T CHANGE FRIEND STATUS");

      } else {  createAndDispatchEvent("friend status changed") }

    });


  });

}

以下是用于拉出记录的代码

  window.pouchDB.query(
    {map : map}, 
    {reduce : false}, 
    function(err, response){

      var responseRows = response['rows'];
      var cleanedList = [];
      _.each(responseRows, function(friend){    

    cleanedList.push({'_id' : friend['key'][0], 'name' : friend['key'][1], 'status' : friend['key'][2] });

      });
      window.reminderList = cleanedList;
      console.log(window.reminderList);
      createAndDispatchEvent("Returned reminder list");

    });

如果我在更新时没有指定“name”字段,那么pouchDB.query中emit()调用返回的数组包含一个空值,我希望“name”值为。

2 个答案:

答案 0 :(得分:9)

CouchDB和PouchDB的设计方式使文档具有原子性。实际上,如果您想要更新单个字段,则必须put()整个文档。

在您的示例中使这更容易的一种方法是直接使用retreived值,而不是创建新对象并手动复制字段。您还可以将文档拆分为多个类型的小文档,而不是一个必须不断读取和重写的单个大文档。

您可能还需要考虑使用allDocs而不是query,因为如果您只需要通过ID获取文档,那么通常会更快。 PouchDB blog有一些关于分页和索引的文章可能对此有所帮助。

修改:现在有一个pouchdb-upsert插件,可以更轻松地更新单个字段。在引擎盖下,它只是put()

答案 1 :(得分:-1)

也许其他用户可能会发现我创建的这种模式很有帮助。它接受要更新的字段的键值对的JSON对象,并保留其他所有字段。

function setFieldOnFriendRecord(friend, operation, event, callback){

  window.pouchDB.get(friend['_id'], function(err, retrieved){

    //TODO: if this genric method works, post it on my pouchDB question on stack overflow

    if(!err){

      var fields = {

    _id : retrieved._id,
    _rev : retrieved._rev,
    name : retrieved.name,
    reminderDate : retrieved.reminderDate,
    status : retrieved.status,
    source : retrieved.source,
    groups : retrieved.groups

      }

      for(key in friend){

    if(friend.hasOwnProperty(key)){

      if(key !== "group"){  

        fields[key] = friend[key]; 

      } else {

        fields['groups'].push(friend['group'])

      }

    }

      }


      window.pouchDB.put(fields, function(err, response){

    if(!err){

      createAndDispatchEvent(event);

      if(callback){ callback(); }

    } else {

      console.log("An error occured while updating during " + operation + ": " + JSON.stringify(err));

    }

      });

    } else {

      console.log("An error occured during " + operation + ": " + JSON.stringify(err));

    }

  });



}