CouchDB清除插入文档?

时间:2012-12-20 08:19:51

标签: node.js couchdb couchdb-nano

我正在使用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);}
    });

数据在别处定义的地方。

3 个答案:

答案 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 handlerswiki)。您只需编写一个JS函数,而不是再次发送整个文档,您可以调用此函数,它可以使更新“就位”。

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