2014-05-12 4 views
2

"_id", "name"및 "status"필드가있는 pouchDB 문서를 만듭니다. 그러나 문서의 "상태"필드를 업데이트하려면 다른 필드를 모두 지정해야합니다. 그렇지 않으면 변경되지 않습니다. 그렇지 않으면 삭제됩니다. 즉, 업데이트시 "이름"필드를 지정하지 않으면 더 이상 문서의 "이름"필드가 없습니다. pouchDB 문서의 단일 필드를 업데이트하는 방법

function createFriendSchedule(friend){ 

    pouchDB.put({ 

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

    }, function(err, response){ 

    createAndDispatchEvent("friend Schedule created"); 

    }); 


} 

내가 "이름"을 지정하지 않으면 기록을 밖으로

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"); 

    }); 

을 당겨하는 데 사용되는 코드 문서 여기

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") } 

    }); 


    }); 

} 

그리고를 업데이트하는 코드입니다 업데이트시 pouchDB.query에서 emit() 호출에 의해 반환 된 배열에는 "name"값이있을 것으로 예상되는 null 값이 들어 있습니다.

답변

9

CouchDB 및 PouchDB는 문서가 원 자성 인 방식으로 설계되었습니다. 따라서 실제로 단일 필드를 업데이트하려는 경우 put() 전체 문서를 사용해야합니다.

새 개체를 만들고 수동으로 필드를 복사하는 대신 retreived 값을 직접 사용하는 것이 한 가지 방법입니다. 또한 지속적으로 읽고 다시 써야하는 하나의 큰 문서 대신 여러 유형의 많은 작은 문서로 문서를 분할 할 수 있습니다.

query 대신 allDocs을 사용하는 것도 좋습니다. ID로 문서를 가져와야하는 경우 일반적으로 더 빠를 수 있기 때문입니다. PouchDB blog에는 여기에서 도움이 될 수있는 페이지 매김 및 색인 생성에 대한 몇 가지 기사가 있습니다.

편집 : 이제는 단일 필드를 쉽게 업데이트 할 수있는 pouchdb-upsert 플러그인이 있습니다. 후드 아래서는 단지 put()입니다.

+0

정말 멋진 라이브러리를 만들어 주셔서 감사합니다. :) 저는 지금 당장 브라우저에서 할 수있는 모든 것을 당연한 것으로 생각합니다! 다른 사람을 명시 적으로 업데이트 할 필요없이 단일 (또는 여러 개의) 필드를 업데이트 할 수있는 사람을 위해 가능한 해결 방법을 게시했습니다. – JoeyC

0

다른 사용자가 도움이 될 수있는 패턴을 발견했을 수도 있습니다. 업데이트 될 필드의 키 - 값 쌍의 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)); 

    } 

    }); 



}