我在处理我认为是一个简单的问题时遇到了麻烦。基本上,我需要一个java.util.Map<String, String>
,其中 id 最终成为映射键,而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 抱怨 reduce 减少得不够......