所以,我正在做的事情应该非常简单,也许就是这样,我只是做错了什么。我想更新我的数据库中的现有文档,但是我遇到了一些问题,有人可以提出建议吗?
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 :(得分: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);
}
});
});