编程语言
首页 > 编程语言> > 如何使用ektorp从couchdb中获取java中的java.util.Map到string prop

如何使用ektorp从couchdb中获取java中的java.util.Map到string prop

作者:互联网

我在处理我认为是一个简单的问题时遇到了麻烦.基本上,我需要一个java.util.Map< String,String>,其中ids最终成为地图键,我文档的someField最终在值中.

我真的很坚持这一点,这让我大吃一惊.我试过写一个单独的视图:

@View(map="function(d) { if (d.someField) { emit(d.someField, null); } }", name = "someField")

然后使用以下Java:

public Map<String, String> getSomeFields() throws JsonParseException, JsonMappingException, IOException {
    ViewQuery q = new ViewQuery().designDocId("_design/" + entity.getSimpleName()).viewName("someField");
    String result = StreamUtils.inputStreamAsString(db.queryForStream(q), false);
    TypeReference<Map<String, String>> mapTypeRef = new TypeReference<Map<String,String>>() {};
    // mapper is a Jackson ObjectMapper
    return mapper.readValue(result, mapTypeRef);
} 

这已经非常难看,但它实际上也不起作用,因为看起来QueryForStream返回的JSON结果包括随机的其他东西,而不仅仅是查询的结果.这会导致readValue调用抛出IOException.

我也尝试使用reduce生成一个包含所有这些值的单个对象,但结果是Couch抱怨减少不足以减少……

解决方法:

我会做这样的事情:

ViewQuery query = ...

Map<String, String> map = new HashMap<String, String>();
for (ViewResult.Row row : db.queryView(query)) {
    map.put(row.getId(), row.getKey());
}

return map;

标签:java,jackson,couchdb,ektorp
来源: https://codeday.me/bug/20190902/1793368.html