couchdb - 如何让 Couchdb/Cloudant 设计文档准备好搜索所有字段?

标签 couchdb pouchdb cloudant

我有一个非常简单的数据库,其中包含一些存储在 Cloudant 中的数据模式。

{
  "_id": "units_modal_the_oaks_preliminary",
  "_rev": "1-b541013bc008680b706ea01969dedb7a",
  "type": "units_modal",
  "label": "Preliminary Modal",
  "notes": "Notes here...",
  "project": "the_oaks",
  "data": [...]
}

我将 Cloudant 与 PouchDB 连接起来。我的目标只是让这个数据库准备好由除数据以外的所有字段进行查询。

我使用 PouchDB-Find 来查询数据。我在创 build 计文档和 View 的文档上花了一整天的时间,但我不知道如何正确地做到这一点。所有文档都建议使用 map 函数和 reduce 函数。我尝试了各种方法来手动设计 map 功能,但是当我运行查询时
remoteDb.find({
    selector:{type:"units_modal"}
})

我收到“no_usable_index”错误。我只能使用 PouchDB-find 的附带方法来创建索引,然后我可以获得我想要的结果:
remoteDb.createIndex({
    index: {
        fields: ['type', 'project','label','notes']
    }
})

我看了设计文档。这是我所拥有的(我重命名了 id 和 View ):
{
  "_id": "_design/project",
  "_rev": "8-c7e2b7c0e1dbaff8e5641a4f06075e14",
  "language": "query",
  "views": {
    "units_modal": {
      "map": {
        "fields": {
          "type": "asc",
          "project": "asc",
          "label": "asc",
          "notes": "asc"
        }
      },
      "reduce": "_count",
      "options": {
        "def": {
          "fields": [
            "type",
            "project",
            "label",
            "notes"
          ]
        },
        "w": 2
      }
    }
  }
}

所有这些都非常令人困惑。看来除了 map 功能之外,我找不到任何可以解释 map 的东西。这里的 map 功能在哪里?关于 map.fields、views.options.def 和 views.options.w 的文档和解释在哪里?

任何人都可以提出一种简单的方法来设计可以轻松查询有关某种类型文档的所有字段的 View 吗?

任何人都可以建议一个我可以得到更多关于 map.fields、view.options 和所有这些关于 CouchDB 的小东西的解释的地方吗?

是否有一个简单的“if(type=='some type') indexAll();”解决方案?

非常感谢!

最佳答案

首先,很抱歉您发现这令人困惑。 Cloudant Query 是 Cloudant/CouchDB 中一个相对较新的特性,实际上是对现有的、较低级别的索引机制(map/reduce 和 search)的封装。用户创建的 map/reduce 或 Cloudant Search 索引不能用于为 Cloudant Query 调用提供服务 - 它维护自己的索引。

Cloudant Query 要求存在合适的索引来为对 _find 的请求提供服务,因此您会收到错误消息。 Cloudant Query 支持(目前)两种不同类型的索引 - JSON(包装 map/reduce)和文本(包装 Cloudant Search/Lucene)。文本索引更灵活,JSON 索引更高效。

文本索引的默认行为是索引每个字段,我们建议从这里开始,除非您知道您的数据库将变得非常大(100s GB)或复杂。您可以 create one通过 PouchDB 使用:

remoteDB.createIndex({
   name: "myindex",
   index": {},
   type: "text"
}).then(function (result) {
   // yo, a result
}).catch(function (err) {
   // ouch, an error
});

或通过 curl :
curl -u <username> 'https://<username>.cloudant.com/<db>/_index' -X POST -H'Content-Type:application/json' -d '{"index":{},"type":"text"}'

如果要更改索引以便省略“数据”,可以指定要索引的字段:
remoteDB.createIndex({
   name: "myindex",
   index": {
       "fields": ["_id","_rev","type","label","notes","project"]
   },
   type: "text"
}).then(function (result) {
   // yo, a result
}).catch(function (err) {
   // ouch, an error
});

创建该索引后,您的 PouchDB-Find 查询应该可以工作了。

如果您想详细了解 Cloudant 中不同类型的查询机制(Cloudant Query、Cloudant Search 和 map/reduce),请查看 learning centre是一个很好的起点。

关于couchdb - 如何让 Couchdb/Cloudant 设计文档准备好搜索所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30429589/

相关文章:

couchdb - 我可以为每个数据库创建多个集合吗?

CouchDB:是否可以访问过滤器功能内的链接文档?

node.js - 加快我的 cloudant 查询速度

css - 在数据库中存储 ReactJS 组件、图像和 css 代码并检索它以动态构建 UI

javascript - 如何删除 pouchDB 中的身份验证模式

Cloudant 的 C SDK?

ibm-cloud - Cloudant on Bluemix 是否存在性能问题?

本地实例不支持 couchdb POST 方法

node.js - 在同一应用程序中使用多个数据库

javascript - NW.js - PouchDB - 无法通过 Node Webkit 中的 require() 使用 PouchDB