我正在使用nano与couchDB,我只是尝试对文档进行简单更新以添加新字段。例如,假设我有一个名为foo的文档。它现在唯一的领域是'bar',有一些价值。然后我尝试使用我将在末尾发布的代码执行db.insert,但是现在不再使用这两个字段,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);}
});
数据在别处定义的地方。
答案 0 :(得分:2)
在nano中,您可以调用原子函数来调用设计文档中的特定更新函数: 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'];
}
然后你可以使用nano调用这个setBar更新函数:
db.atomic('_foo', 'setBar', your_foo_document_id, { bar: barvalue }, function (err, headers) {
if (err) {
return callback(err);
}
... rest of your code
答案 1 :(得分:0)
对于每次更新,您需要提供整个文档,而不仅仅是要添加到文档的字段。因此,您需要获取文档的当前版本,向其添加字段然后执行db update。
dB.insert({qwax : [data], "_rev" : body._rev, "bar" : body.bar}, 'foo', function(err, body, header) {
if (err) {
console.log(err.message);
return;
}
});
答案 2 :(得分:0)
您可以在设计文档中使用update handlers(wiki)。您只需编写一个JS函数,而不是再次发送整个文档,您可以调用此函数,它可以使更新“就位”。
该函数将获得两个参数:要更新的文档和客户端提供的一些数据,它将在HTTP标头中返回更新文档的新版本。