首页 > 解决方案 > 将单独的文档作为一个对象检索

问题描述

我有两种基本的文档类型:

我正在使用 Ektorp 作为驱动程序。现在有两个 POJO,反映了文档,并且 Patient POJO 也有一个Set<Analysis>, 标记为@DocumentReferences注释(我实际上还不需要,但稍后可能会使用它来显示一个病人的所有分析,例如)。

但是,我想要做的是使用分页来用行填充 TableView,其中包含有关患者和分析的信息,按分析日期降序排序。现在,我唯一的想法是

  1. 查询 CouchDB 以获取按日期排序的所有分析文档(通过 Ektorp 中的 PageRequest 使用分页)
  2. 然后对于具有患者 ID 的患者的每个分析查询数据库
  3. 创建一个单独的类,表示表中包含患者和分析字段的行,然后使用检索到的分析和患者对象创建该类的对象。

在代码中它看起来有点像这样:

PageRequest pageRequest = PageRequest.firstPage(5);

ViewQuery query = new ViewQuery()
    .designDocId("_design/analysis")
    .viewName("by_date")
    .descending(true)
    .includeDocs(true);

Page<Analysis> result = db.queryForPage(query, pageRequest, Analysis.class);
for(Analysis analysis : result) {
    Patient patient = db.find(Patient.class, analysis.getPatientId());
    Row row = new Row(patient, analysis);
    //TODO: ...Populate TableView...
}

这一切听起来很麻烦。有一个更好的方法吗?我可以一次性(或至少在一次查询中)反序列化我需要的数据吗?我知道有一种方法可以{_id: doc.patientId}用作函数中的值,emit()以便在使用 parameter 查询时为每个分析返回 Patient include_docs=true,但我不确定如何利用它来发挥我的优势。

我可以将 Patient 嵌入到 Analysis 中,但是如果 Patient 发生变化,我将不得不更改每个 Analysis 文档,所以这不是一个好的解决方案。我已经多次阅读 两段文档,但我一生都无法弄清楚如何使用 Ektorp 实现它们。任何帮助,将不胜感激。

标签: javacouchdbektorp

解决方案


推荐阅读