我有一个管理电视剧的程序,我遇到了一个关于lightcouch和特定数据库查询的问题。这就是我到目前为止所拥有的。为了设置数据库视图,我使用了以下几行:
MapReduce get_numberOfSeasonsMR = new MapReduce();
get_numberOfSeasonsMR.setMap(
"function(doc) { "
+ " emit(doc.seriesName, doc.season)"
+ "}");
get_numberOfSeasonsMR.setReduce(
"function (key, values, rereduce) {"
+ "return Math.max.apply({}, values)"
+ "}");
map.put("get_numberOfSeasons", get_numberOfSeasonsMR);
在被褥中,一切正常(见http://i.stack.imgur.com/1hgSJ.png)。
然而,当我尝试执行以下行时,我得到一个例外,而不是出现在Futon中的结果。
int nr = client.view("design/get_numberOfSeasons").key("Arrow").queryForInt();
例外:
org.lightcouch.NoDocumentException: Expecting exactly a single result of this view query, but was: 0
org.lightcouch.View.queryValue(View.java:246)
org.lightcouch.View.queryForInt(View.java:219)
....db.Server.getNumberOfSeasons(Server.java:237)
...
我尝试在我的map()函数中发出字符串而不是整数,但它没有任何区别。我究竟做错了什么?或者有人可以发布一个成功的lightcouch map()+ reduce()操作的例子吗?我发现的教程只使用了map()而没有使用reduce()。
提前致谢;)
答案 0 :(得分:1)
您的代码似乎没有错,这是完整版:
CouchDbClient dbClient = new CouchDbClient();
DesignDocument designDocument = new DesignDocument();
designDocument.setId("_design/mydesign");
designDocument.setLanguage("javascript");
MapReduce get_numberOfSeasonsMR = new MapReduce();
get_numberOfSeasonsMR.setMap(
"function(doc) { "
+ " emit(doc.seriesName, doc.season)"
+ "}");
get_numberOfSeasonsMR.setReduce(
"function (key, values, rereduce) {"
+ "return Math.max.apply({}, values)"
+ "}");
Map<String, MapReduce> view = new HashMap<>();
view.put("get_numberOfSeasons", get_numberOfSeasonsMR);
designDocument.setViews(view);
dbClient.design().synchronizeWithDb(designDocument);
int count = dbClient.view("mydesign/get_numberOfSeasons").key("Arrow").queryForInt();