【问题标题】:Unable to add a view to my existing database in couchDB无法将视图添加到我在 couchDB 中的现有数据库
【发布时间】:2020-05-25 19:31:24
【问题描述】:

我有一个现有的设计文档。我想使用 curl POST 命令导入这个设计视图。这样我就可以在 fauxton 中查看。

{
    "total_rows": 1,
    "offset": 1,
    "rows": [
        {
            "id": "_design/editor",
            "key": "_design/editor",
            "value": {
                "rev": "1-c74604129e122055f0b58760a7e08ed8"
            },
            "doc": {
                "_id": "_design/editor",
                "_rev": "1-c74604129e122055f0b58760a7e08ed8",
                "language": "javascript",
                "views": {
                    "all_vendors": {
                        "map": "function(doc) {\n  if (doc.type==\"vendor\"){\n  emit(doc.name, doc.name);\n }\n}"
                    }
                }
            }
        }
    ]
}

我正在尝试使用以下命令将此文档添加到现有数据库中

curl -X POST http://127.0.0.1:5984/${db_name}/_design/${design_name}/_view/${view_name}

【问题讨论】:

  • POST 执行视图。创建 _design 文档与创建任何其他文档没有什么不同。
  • @RamblinRose 我尝试了您提到的链接中的方法。我在 PUT 命令期间遇到错误{ "error": "conflict", "reason": "Document update conflict." }
  • 这意味着设计文档存在。目前尚不清楚“无法看到此视图”是什么意思。问题是视图没有返回结果,还是您想查看设计文档?如果是后者,curl -X GET http://127.0.0.1:5984/${db_name}/_design/${design_name} 应该可以工作。
  • 该数据库中不存在设计文档。这是一个简单的问题,我无法使用 curl 命令在数据库中添加新视图。我提到的命令不起作用。
  • 最简单的诊断方法是启动 Fauxton 并查看一下。 409 Conflict 是危险信号。祝你好运

标签: curl couchdb rhel7 design-view


【解决方案1】:

您没有显示您要上传的实际文档,而且您使用的是 POST,所以我不得不猜测一下您在做什么。您是说要上传的文档在数据库中不存在,所以让我们使用 PUT 代替,并删除可能驻留在文档本身中的任何 revs:

% cat ddoc.json 
{"_id":"_design/editor","views":{"all_vendors":{"map":"function (doc) {\n  if (doc.type==\"vendor\"){\n    emit(doc.name, doc.name);\n  }\n}"}},"language":"javascript"}

所以你的观点是:注意没有 _rev 字段。这是至关重要的。让我们将其卷曲到数据库中(我使用的是 Cloudant,但对于 couchdb 应该也适用):

% acurl -XPUT 'https://skruger.cloudant.com/source/_design/editor' -d@ddoc.json
{"ok":true,"id":"_design/editor","rev":"3-42790f55c52a203d1e83e0e94c2664a0"}

我现在可以在 fauxton 中很好地看到该视图:

以及命名视图本身:

【讨论】:

  • 去掉rev标签后添加了设计文档。但是在设计文档中,我应该能够看到名称为 all_vendors 的视图,但我仍然看不到它。 all_vendor 应该出现在设计文档下的视图选项卡中。
  • 它肯定会出现在我的数据库中——我在上面的帖子中添加了另一个屏幕截图。
  • 您好,感谢您的回复。它现在工作了 我只需要使用 JSON 传递 doc 标签数据 但是,我有两个查询 1. 为什么我们需要删除 rev 标签。 2.我们如何从现有的DB中获取设计文档内容..提前谢谢:)
  • 这就是 CouchDB 中的 MVCC 的工作方式——如果你传递了一个 rev,你就是说你想更新文档的确切版本。因此,如果您从现有数据库中获取文档,则它有一个 rev。但是,如果您随后尝试将其存储在新的数据库中,或者该文档的 id 不存在的数据库中,则会发生冲突,因为 rev 尚不存在。如果你想用 curl 提升和移动现有的 ddoc,你必须删除 _rev,使用带有 new_edits=false 的 bulk_docs 调用——但这是很深奥的魔法领域。
  • 当我们做 bulk_docs 时,它不会区分 design_doc 和普通文档。它只是像往常一样添加所有文档。
猜你喜欢
  • 2020-12-13
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多