如何让Couchdb / 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来查询数据.我花了一整天的时间来创建设计文档和视图的文档,但我无法弄清楚如何正确地完成它.所有文件都表明地图功能&减少功能.我已经尝试了各种方法手动设计地图功能,但是当我运行查询时

remoteDb.find({
    selector:{type:"units_modal"}
})

我收到“no_usable_index”错误.我只能使用PouchDB-find的附带方法来创建索引&然后我可以得到我想要的结果:

remoteDb.createIndex({
    index: {
        fields: ['type', 'project','label','notes']
    }
})

我看了一下设计文档.这就是我所拥有的(我已经重命名了id和视图):

{
  "_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.fields,views.options.def和views.options.w的解释?

任何人都可以建议一种简单的方法来设计可以轻松查询某些类型文档的所有字段的视图吗?

任何人都可以提出一个地方,我可以得到更多关于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)和text(包含Cloudant Search / Lucene).文本索引更灵活,JSON索引更高效.

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

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"}'

如果要更改索引以便省略“data”,可以指定要编制索引的字段:

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查询,Cloudant搜索和map / reduce)的更多信息,learning centre是一个很好的起点.

点赞