簡體   English   中英

CouchDB更新文件

[英]CouchDB update document

請確認這是我可以在bedDB中更新文檔的唯一方法;

為了更新文檔(我們稱其為fooDoc),我需要傳遞“ _rev”。 所以首先,我需要通過以下代碼(foo.get)來獲取該文檔,然后在具有“ _rev”的回調中使用上一次修訂的版本使用foo.insert來更新該文檔:

var foo = nano.db.use('foo');
foo.get('fooDoc', function (err, body) {
    console.log("get:", err, body);
    foo.insert({"_id": "fooDoc", "_rev": body['_rev'], "name": "newName", "bar": "baz"}, function (err, body) {
        console.log("insert:", err, body);
    })

});

更新:

感謝Nuno的幫助:所以我一直在關注本文檔 但是,似乎更新處理程序的json格式不是有效的json,因此我將其更新為以下json:

{
    "updates": {
        "inplace": "function(doc, req) {var field = req.form.field;var value = req.form.value;var message = 'set '+field+' to '+value;doc[field] = value;return [doc, message];}"
    }
}

現在,當我運行以下代碼時,它沒有更新,以下是日志:

錯誤:null重新放置:將undefined設置為undefined

編碼:

foo.atomic("update", "inplace", "bar6",
        {crazy: true}, function (error, response) {
    console.log("error:", error, "respose:", response)
});

我非常感謝您在這方面的幫助

最后更新:哦,我知道了問題所在; 來自這里的更新處理程序在這里輸入鏈接描述不正確; 正確的更新處理程序為:

{
   "inplace": "function (doc, req) {var message;var body=JSON.parse(req.body);for (id in body) {doc[id] =body[id];message += 'set ', id, 'to', body[id];}return[doc,message];}"
}

在沒有_rev編號事先知識的情況下,更新文檔的唯一方法是通過update函數 在nano中,用db.atomic調用更新函數。

但是您不一定需要獲取整個文檔,只需獲取_rev。

正如Mike所說,要獲得單個文檔的_rev,可以發出HEAD請求。 _rev將在ETag標頭中。 在nano中使用db.head

您也可以通過查詢_all_docs一次性獲取多個文檔的_rev 在nano中使用db.list

您還可以執行HEAD請求,以通過標頭中返回的Etag獲取修訂ID。 與獲取整個文檔相比,網絡流量要少一些。

但是,使用此模式確實會刪除使用修訂ID的安全網,以避免覆蓋自您閱讀文檔以來所做的對文檔的修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM