在couchdb的nodejs的nano模块中更新文档的字段

时间:2012-01-24 06:17:39

标签: javascript node.js couchdb database-update couchdb-nano

假设在node.js上通过nano打开了一个couchdb会话

var dbserv = require('nano')('http://localhost:5984');

在couchdb服务器dbserv可以访问的情况下,有一个数据库users,其用户的字段groups是一个数组。

如果我想更新groups中用户jim的{​​{1}},如何在不替换整个文档的情况下这样做?

2 个答案:

答案 0 :(得分:3)

CouchDB的

要创建更新处理程序,请编写设计文档:

{
  "_id": "_design/yourapp",
  "updates": {
    "foo": "function(doc, req) {
      doc.groups.push(req.query.bar); // or do whatever you like with it
      return [doc, 'done'];
    }"
  }
}

并将其放在您的数据库_design/yourapp的数据库中,然后像这样获取它:

http://localhost:5984/users/_design/yourapp/_update/foo/jim?bar=baz

nanocouch

var dbserv = require('nano')('http://localhost:5984');
var db = dbserv.use('users');

var designdoc = {/* The above design document */};

db.insert(designdoc);

db.get('_design/yourapp/_update/foo/jim', {bar: 'baz'});

请注意,您只需插入一次设计文档,甚至可以使用curl手动执行,然后更新您的文档,只需按照上述说明发出GET请求。

免责声明:未经测试,之前我从未使用过nano,但它应该与您必须做的事情保持一致。

答案 1 :(得分:3)

找到了一种更新的方法,没有所有_design需求等。 Nano CouchDB的问题在于插件实际上并没有提供发送更新所需的正确_rev的位置。 无论如何,有一个解决方法。 需要做的是从要更新的_id中获取_rev值。 因此,您使用Nano db.get作为大函数,获取_rev值并更新您的文档。 这是一个代码示例:

 users.get('document_name', function(err, doc) {
        updaterev = doc._rev;
        users.insert({title:'here_ya_go',_rev:updaterev},'document_name', function(err, body , header) {
            if (!err)
            {
                console.log(body);
                res.send('update website succeed');
            }
            else
            {
                console.log(err.error);
            }
        });
  });

当db.insert函数在db.get函数中时,它让我们有机会抓住_rev并更新文档。

我知道,我可能没有发明这一点,但重要的是让这段代码能够抓住并继续前进。 祝你好运。