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

时间:2015-05-24 23:55:27

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

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

我得到了#34; no_usable_index"错误。我只能使用PouchDB-find的方法来创建索引&那么我可以得到我想要的结果:

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

我看了设计文档。这就是我所拥有的(我已将其重命名为id& views):

{
  "_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 =='某种类型')indexAll();"溶液

非常感谢!

2 个答案:

答案 0 :(得分:1)

  

这里的地图功能在哪里?

map函数用于在couchdb上创建辅助索引,允许您通过特定键查询文档。默认情况下,couchdb中只有一个索引可用,它只能通过_id字段进行查询。

Cloudant目前支持两种创建indces的方法。首先是借助map和reduce函数的传统方式。

然后他们有一个新的query api。在您的示例中,您正在使用查询api [1]。

  

有人可以建议一种简单的方法来设计可以轻松查询某些类型文档的所有字段的视图吗?是否有一个简单的" if(type =='某种类型')indexAll();"解?

这是一个适合您的地图功能

function(doc){
for(var prop in Object.keys(doc))
if(prop!=="data") emit(doc[prop]);
}

这使得所有字段除了"数据"可查询。

这是进入设计文档的?这里

"views": {
    "units_modal": {
      "map": "function(doc){for(var prop in Object.keys(doc))if(prop!=="data"){emit(doc[prop])};
}"
      }

这里要注意的一点是,设计文档就像存储json数据的任何其他couchdb文档一样。但是json中不允许使用函数。因此,要么必须手动对它们进行字符串化,要么使用可帮助您执行此操作的库,如couchapp

pouchdb的索引将用于客户端数据库。因此,如果您在pouchdb数据库上创建索引,那么这些索引将无法与您的远程cloudant / couchdb数据库一起使用。

但查询和创建索引的api完全相同。

此外,如果您想使用cloudant"查询语法" pouchdb中的样式查询,有一个plugin可用来帮助你做到这一点。

[1] 在couchdb中,目前只允许使用map reduce函数(最高1.6.1)。但他们正在努力合并2.0中的查询语法。

答案 1 :(得分:1)

首先,道歉,你发现这令人困惑。 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是一个很好的起点。