1

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

数据在别处定义的地方。

4

3 回答 3

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
于 2012-12-21T10:44:11.137 回答
0

对于每个更新,您需要提供整个文档,而不仅仅是要添加到文档的字段。因此,您需要获取文档的当前版本,向其中添加文件,然后进行数据库更新。

dB.insert({qwax : [data], "_rev" : body._rev, "bar" : body.bar}, 'foo', function(err, body, header) {
                if (err) {
                    console.log(err.message);
                    return;
                }
            });
于 2012-12-20T10:02:00.050 回答
0

为此,您可以在设计文档中使用更新处理程序( wiki )。您只需编写一个 JS 函数,而不是再次发送整个文档,而是调用此函数,它可以使更新“就地”。

该函数将获取两个参数:要更新的文档和客户端提供的一些数据,并将在 HTTP 标头中返回更新文档的新版本。

于 2012-12-20T14:36:55.367 回答