org.ektorp.DocumentNotFoundException: nothing found on db path: /cbs_track/_design/tech_demo/_view/view_location?descending=true, Response body: {"error":"not_found","reason":"missing"}
at org.ektorp.http.StdResponseHandler.createDbAccessException(StdResponseHandler.java:40)
at org.ektorp.http.StdResponseHandler.error(StdResponseHandler.java:68)
at org.ektorp.http.RestTemplate.handleResponse(RestTemplate.java:122)
at org.ektorp.http.RestTemplate.getUncached(RestTemplate.java:27)
at org.ektorp.impl.DefaultQueryExecutor.executeQuery(DefaultQueryExecutor.java:49)
at org.ektorp.impl.StdCouchDbConnector.executeQuery(StdCouchDbConnector.java:441)
at org.ektorp.impl.StdCouchDbConnector.queryView(StdCouchDbConnector.java:472)
at com.ibm.cbs.services.techdemo.TechDemo.main(TechDemo.java:135)
之所以会报这个错误,是因为你的cloudant中没有创建指定文档tech_demo和指定二级索引view_location。
solution:
基于二级索引(在cloudant中叫view)的查询是在下述地址后面增加参数:
“https://<youraccount>.cloudant.com/<yourdb>/_design/<design-doc>/_view/<view-name>”
可选的参数有descending、 endkey_docid、 group、group_level、 include_docs、 inclusive、keys、 limit、 stale等,具体请参见:
“https://docs.cloudant.com/api.html#querying-a-view”。
补充:
1. 简单介绍一下二级索引和查询:
二级索引在Cloudant中,又被称作View,是一个通过MapReduce来计算产生的b+树索引。这个索引是通过Cloudant后台的MapReduce操作作产生的,这些操作并行的运行在所有节点上,以增量的方式更新索引,反映新增、更改以及删除的文档变化。
创建二级索引由Map和Reduce两部分组成。Map部分通过JavaScript定义,比如下面的例子中,如果文档中存在一个叫做"type"的对象,并且它的值为"entry",就取出文档中的一个叫做userid的对象加入索引。
Reduce部分可以用Cloudant内建的_count、_sum、_stats等操作符,可以完成一些常用的在线分析。
对于每个数据库,可以创建任意数量的二级索引。二级索引的定义会被记录在设计文档(Design Document)中,同一个设计文档中的二级索引会被同时更新。有关二级索引的定义及方法请参见:“https://docs.cloudant.com/api.html#creating-views”。
Note:设计文档(Design Document)是一类特殊的文档,不存普通数据,存函数。
在RMDB中,索引(index)和视图(view)是完全不同的conception。cloudantDB中,虽然取名叫view,实际上是b+树索引。知道怎么用就ok了。
2. 在cloudant中,创建view:
To create a view, upload a design document containing the index:
// Uploads the design document with view index:
// {
// "_id": "_design/name",
// "views": {
// "view1": {
// "map":"function(doc){emit(doc.field, 1)}",
// "reduce": "function(key, value, rereduce){return sum(values)}"
// }
// }
// }
Map<String, Object> view1 = new HashMap<>();
view1.put("map", "function(doc){emit(doc.field, 1)}");
view1.put("reduce", "function(key, value, rereduce){return sum(values)}");
Map<String, Object> views = new HashMap<>();
views.put("view1", view1);
Map<String, Object> view_ddoc = new HashMap<>();
view_ddoc.put("_id", "_design/name");
view_ddoc.put("views", views);
db.save(view_ddoc);
query是按这种方式query:https://<youraccount>.cloudant.com/<yourdb>/_design/<design-doc>/_view/<view-name>,可以跟很多参数。