如何使用Cloudant Node.js更新Cloudant中的文档

时间:2015-07-10 20:10:05

标签: node.js cloudant

所以,我正在做的事情应该非常简单,也许就是这样,我只是做错了什么。我想更新我的数据库中的现有文档,但是我遇到了一些问题,有人可以提出建议吗?

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) {});

所以问题是,如何传递我的对象并让它更新,而不是创建新记录?

4 个答案:

答案 0 :(得分:4)

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

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

_id和_rev都是必需的,以便更新起作用。 它们也应该在你发送的对象中。

答案 1 :(得分:3)

db.insert(...)命令中的第一个参数是您要创建/更新的文档。如果您传入带有._rev属性的文档,那么它将使用Cloudant中的相同_rev替换文档,并将文档作为db.insert(...)的第一个参数传入。如果文档不包含._rev属性,则Cloudant将创建一个全新的文档。

这解释了您在所尝试的两种方案中遇到的行为。要对您的文档进行更新,请确保在将._id._rev属性用作{的第一个参数时包含其余的文档属性{1}}功能。

答案 2 :(得分:0)

知道了!这是解决方案:

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

答案 3 :(得分:0)

首先获取记录id和rev id(_id,_rev)

const newData={email:"aftabfalak956@gmail.com",name:"Aftab Falak"}

cloudant.use("user").find({selector:{_id:"user_id"}}, (err, documents) => {

    var revision = documents.docs[0]._rev;
    const data={...documents.docs[0],...newData};
    
    cloudant.use("user").insert(data,{_rev:revision},function(err){
        if (!err) {
            console.log('success', 'The record was updated successfully');
        }
        else {
            console.log('failure', err);
        }
    });

});