我有两种基本的文档类型:
- 具有字段名称和编号的患者;
- 分析包含 3 个数组、分析日期、一堆浮点数和一个患者 ID 的字段,将其链接到患者,因此患者和分析之间存在 1:M 关系。
我正在使用 Ektorp 作为驱动程序。现在有两个 POJO,反映了文档,并且 Patient POJO 也有一个Set<Analysis>
, 标记为@DocumentReferences
注释(我实际上还不需要,但稍后可能会使用它来显示一个病人的所有分析,例如)。
但是,我想要做的是使用分页来用行填充 TableView,其中包含有关患者和分析的信息,按分析日期降序排序。现在,我唯一的想法是
- 查询 CouchDB 以获取按日期排序的所有分析文档(通过 Ektorp 中的 PageRequest 使用分页)
- 然后对于具有患者 ID 的患者的每个分析查询数据库
- 创建一个单独的类,表示表中包含患者和分析字段的行,然后使用检索到的分析和患者对象创建该类的对象。
在代码中它看起来有点像这样:
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 实现它们。任何帮助,将不胜感激。