reduce()不使用lightcouch

时间:2014-03-20 15:12:50

标签: java mapreduce couchdb


我有一个管理电视剧的程序,我遇到了一个关于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()。

提前致谢;)

1 个答案:

答案 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();