2015-07-10 46 views
1

因此,我所做的事情應該非常簡單,也許是這樣,我只是在做錯事。我想更新我數據庫中的現有文檔,但是我遇到了一些問題,請問有人可以提供建議嗎?如何使用Cloudant更新Cloudant中的文檔Node.js

Nano的文檔狀態爲插入如下:

db.insert(doc, [params], [callback]) 

因此,我一定能夠做到以下幾點:

var user = { 
    'firstname' : 'my', 
    'secondname' : 'name' 
}; 

db.insert(user, {_rev: '2-cc5825485a9b2f66d79b8a849e162g2f'}, function(err, body) {}); 

但是,每當我試試這個,它創建了一個全新的文件。如果我下面那確實會更新我的文檔,當然,什麼也沒有這個文件不是_rev其他:

db.insert({_rev: '2-cc5825485a9b2f66d79b8a849e162g2f'}, function(err, body) {}); 

所以現在的問題是,如何我通過我的對象,並得到它更新,而不是創建新記錄?

+0

我想你需要傳遞文檔的id與文檔。但我從未使用過雲。 –

+0

感謝凱文,你幫助我沿着這條路走下去! – Creights

回答

0

Got it!這裏的解決方案:

db.get('user', { revs_info: true }, function(err, doc) { 

    if (!err) { 
    console.log(doc); 

    doc.firstname = 'my'; 
    doc.secondname = 'name'; 

    db.insert(doc, doc.id, function(err, doc) { 
     if(err) { 
      console.log('Error inserting data\n'+err); 
      return 500; 
     } 
     return 200; 
    }); 
    } 
}); 
+0

我想你只需要'db.insert(doc,function(err,doc){...});'。另外,本例中不需要'revs_info:true',所有的文檔'GET'請求都會包含'_rev'字段。 'revs_info'會給你一堆你可能不需要的元數據。 –

1

db.insert(...)命令第一個參數是要創建/更新的文件。如果您通過._rev屬性的文檔傳遞,那麼它將使用作爲db.insert(...)的第一個參數傳入的文檔替換具有Cloudant中的相同_rev的文檔。如果文檔不包含._rev屬性,則Cloudant將創建一個全新的文檔。

這解釋了您在兩種場景中遇到的行爲。爲了對文檔進行更新,請確保包含._id._rev屬性,以及將它用作db.insert(...)函數的第一個參數時文檔的其餘屬性。

2
var user = { 
    'firstname' : 'my', 
    'secondname' : 'name', 
    '_id': <id from prev object>, 
    '_rev': <rev from prev object> 
}; 

db.insert(user, function(err, body) {}); 

爲了使更新正常工作,_id和_rev都是必需的。 他們應該在你也發送的對象。

相關問題