【问题标题】:Update a field of a document in nano module of nodejs for couchdb为 couchdb 更新 nodejs 的 nano 模块中的文档字段
【发布时间】:2019-05-23 18:47:07
【问题描述】:

说在node.js上通过nano打开了一个couchdb session

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

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

如果我想在users 中更新用户jimgroups,我将如何在不替换整个文档的情况下这样做?

【问题讨论】:

  • 您可以使用document update handlers“模拟”这种行为。
  • @MarcelloNuccio 我在这个问题之前看到了那个页面,它让我对如何实际创建、存储和执行它感到困惑。既然我不知所措,我要求一个例子。

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


【解决方案1】:

沙发数据库

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

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

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

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

纳米沙发

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,但它应该是你必须做的。

【讨论】:

  • @Havvy,您必须注意一件事:使用更新处理程序等同于:(1) 获取文档; (2) 更新文件; (3) 保存文件。这意味着同一文档的另一个并发更新可能发生在 (1) 和 (3) 之间,这将产生冲突(响应 409)。
【解决方案2】:

找到了一种无需所有 _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 并更新输出文档。

我知道,这可能不是我发明的,但拥有这段代码很重要。 祝你好运。

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多