2014-05-12 11 views
2

更新中單場我創建「_id」,「名稱」和「狀態」字段pouchDB文件。然而,我發現,如果我想更新文件的「狀態」字段,然後我還需要指定所有其他領域我不是改變以及否則他們將被刪除。也就是說,如果我沒有在更新時指定「名稱」字段,則文檔中不再有「名稱」字段。如何將pouchDB文件

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

    }); 

如果我不指定「名稱」的代碼在更新域,在pouchDB.query信號發送的()調用返回的數組包含在那裏我想到了「名」的值是一個空值。

回答

9

的CouchDB和PouchDB被設計在這樣一種方式,文件是原子。所以,事實上,如果要更新一個字段,你必須put()整個文檔。使您的示例中這更容易

一種方法是直接使用,而不是創建一個新的對象,然後手動複製領域在retreived值。你也可以將你的文檔分成多種類型的小文檔,而不是一個必須不斷閱讀和重寫的大文檔。

您可能還想考慮使用allDocs而不是query,因爲如果您只需按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)); 

    } 

    }); 



}