我正在将nano与couchdb一起使用,我只是想对文档进行简单的更新以添加新字段。例如,假设我有一个名为foo的文档。目前唯一的字段是" bar",具有一定的价值。然后,我尝试使用我将在最后发布的代码进行db.intert,但现在没有两个字段,而是删除了bar,而是我只有我的新字段。我该如何解决?
我正在使用的代码:
dB.get('foo', function(err, body) {
if (!err){
if(typeof body.qwax === 'undefined'){
dB.insert({qwax : [data], "_rev" : body._rev}, 'foo', function(err, body, header) {
if (err) {
console.log(err.message);
return;
}
});
}
else{
body.qwax.push(data);
dB.insert({qwax : body.qwax, "_rev" : body._rev}, 'foo', function(err, body, header) {
if (err) {
console.log(err.message);
return;
}
});
}
}
else{console.log(err);}
});
在其他地方定义数据的地方。
在纳米中有一个原子函数,您可以调用特定的更新功能,为设计文档:https://github.com/dscape/nano#dbatomicdesignname-updatename-docname-body-callback
这是文档中提到的用法示例:https://github.com/dscape/nano/blob/master/tests/design/atomic.js
例如,您可以创建此更新属性属于_foo设计文档:
updates: {
setBar: function (doc, req) {
var body = JSON.parse(req.body);
doc.bar = body.bar;
return [doc, 'OK'];
}
然后,您将使用纳米调用此SETBAR更新功能:
db.atomic('_foo', 'setBar', your_foo_document_id, { bar: barvalue }, function (err, headers) {
if (err) {
return callback(err);
}
... rest of your code
对于每个更新,您需要提供整个文档,而不仅仅是要添加到文档的字段。因此,您需要获取文档的当前版本,将文件添加到其中,然后进行数据库更新。
dB.insert({qwax : [data], "_rev" : body._rev, "bar" : body.bar}, 'foo', function(err, body, header) {
if (err) {
console.log(err.message);
return;
}
});
您可以在设计文档中使用更新处理程序(Wiki)。您只需编写一个JS函数,而不是再次发送整个文档,而是调用此功能,它可以使更新为"适当"。
该函数将获得两个参数:要更新的文档和客户提供的一些数据,并且它将在HTTP标题中返回更新文档的新版本。