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

如何让Couchdb/Cloudant设计文档准备好搜索所有字段?,couchdb,pouchdb,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中的数据模型

{
  "_id": "units_modal_the_oaks_preliminary",
  "_rev": "1-b541013bc008680b706ea01969dedb7a",
  "type": "units_modal",
  "label": "Preliminary Modal",
  "notes": "Notes here...",
  "project": "the_oaks",
  "data": [...]
}
我将Cloudant与数据库连接。我的目标只是让这个数据库为除数据之外的所有字段的查询做好准备

我使用数据库查找来查询数据。我花了一整天的时间在创建设计文档和视图的文档上,但我不知道如何正确地完成它。所有文档都建议使用map函数和reduce函数。我尝试过各种手动设计map函数的方法,但是当我运行查询时

remoteDb.find({
    selector:{type:"units_modal"}
})
我得到了“无可用索引”错误。我只能使用PockDB find的shipped方法创建索引&然后我可以得到我想要的结果:

remoteDb.createIndex({
    index: {
        fields: ['type', 'project','label','notes']
    }
})
我看了一下设计文件。以下是我得到的(我已重命名id和视图):

所有这些都非常令人困惑。很明显,除了一个map函数,我找不到任何东西来解释map。地图功能在哪里?关于map.fields、views.options.def和views.options.w的文档和说明在哪里

有谁能提出一种简单的方法来设计视图,以便轻松查询某一类型文档的所有字段吗

有谁能推荐一个地方让我能得到更多关于map.fields、view.options和所有这些关于CouchDB的小东西的解释吗

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

非常感谢

地图功能在哪里

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

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

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

有谁能提出一种简单的方法来设计视图,以便轻松查询某一类型文档的所有字段吗?是否有一个简单的“if(type=='some 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中不允许使用函数。因此,要么您必须手动对它们进行字符串化,要么使用一个库来帮助您这样做

数据库的索引将用于客户端数据库。所以,如果您在PockDB数据库上创建索引,那么这些索引将无法用于远程cloudant/couchdb数据库

但是查询和创建索引的方法完全相同

另外,如果您想在PockDB中使用cloudant“查询语法”样式的查询,有一个可用的工具可以帮助您做到这一点


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

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

Cloudant查询要求存在一个合适的索引来为“查找”请求提供服务,从而得到错误消息。Cloudant Query(目前)支持两种不同类型的索引—JSON(包装map/reduce)和text(包装Cloudant Search/Lucene)。文本索引更灵活,JSON索引更高效

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

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

curl -u <username> 'https://<username>.cloudant.com/<db>/_index' -X POST -H'Content-Type:application/json' -d '{"index":{},"type":"text"}'
创建索引后,您的数据库查找查询应该可以工作


如果您想进一步了解Cloudant中不同类型的查询机制(Cloudant查询、Cloudant搜索和map/reduce),这是一个很好的起点。

感谢您的详细回复。你能不能建议,比如说,如果我在数据库中有不同类型的文档,我可以用type=='sucere_type'索引这些文档,并根据这些给定的字段进行索引?那么,我希望为不同的字段指定不同的类型,而不是所有的文本,怎么样?通过在索引中添加一个“选择器”字段,可以为不同的文档类型指定不同的索引(例如,请参阅中的文档)。如果您需要更多的控制,那么我建议您转而查看Cloudant搜索索引。PockDB中没有对这些的直接支持,但是直接进行HTTP调用或者编写一个小的PockDB插件来调用搜索索引都很容易,CouchDB和Cloudant有不同的查询选项-不需要/期望您在所有平台上使用相同的索引策略。太棒了。出于某种原因,我忽略了这个api。这解释了一切。干杯
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
});