广告:我使用的是CouchbaseLite Android 1.4.0,我还没有准备好切换到2.0。
要了解我的问题:
PATIENT
& VISIT
visitId
startDateTime
和endDateTime
endDateTime
为空或缺少visitType
inactive
我想:
skip
和limit
我设法得到所有正确的患者并对结果进行分页,但问题在于排序。 由于分页,我无法进行“后期排序”(以随机顺序获取结果,然后使用自制方法对它们进行排序)。
所以这里是没有排序的实际工作方式:
if (isVisit()) {
Object inactive = document.get(FIELDS.INACTIVE);
if(inactive == null)
inactive = false;
Document patientDoc = database.getExistingDocument(FIELDS.PATIENT_ID);
if(patientDoc != null && patientDoc.getProperties() != null) {
Object[] keys = {
document.get(CouchbaseVisitManager.FIELDS.STOP_DATE_TIME),
inactive,
document.get(CouchbaseVisitManager.FIELDS.VISIT_TYPE)
};
Object[] values = {
document.get(FIELDS.PATIENT_ID),
patientDoc.getProperties().get(FIELDS.FAMILY_NAME),
patientDoc.getProperties().get(FIELDS.FIRST_NAME)
}
emitter.emit(keys, values);
}
}
Query query = getQuery(Views.PATIENTS_CURRENTLY_IN_VISIT); //Helper method to create a query
query.setKeys(new ArrayList<Object>(){{
add(new ArrayList<Object>(){{
add(null);
add(false);
add(visitType);
}});
}});
query.setSkip(skip);
query.setLimit(limit);
这对我的病人来说很有效,但不能对他们进行分类。
我尝试在视图中添加患者姓名,如下所示:
Object[] keys = {
patientDoc.getProperties().get(FIELDS.FAMILY_NAME),
patientDoc.getProperties().get(FIELDS.FIRST_NAME),
document.get(FIELDS.STOP_DATE_TIME),
inactive,
document.get(FIELDS.VISIT_TYPE)
};
并像这样更新我的query.keys
:
query.setStartKey(new ArrayList<Object>(){{
add(null);
add(null);
add(null);
add(false);
add(visitType);
}});
query.setEndKey(new ArrayList<Object>(){{
add(new HashMap<>());
add(new HashMap<>());
add(null);
add(false);
add(visitType);
}});
但这不会使患者返回(result.size = 0)
所以......我不知道如何实现我的目标。 我想要一种按值排序的方法,但它似乎还没有存在(我认为应该等待2.0)。但他们是否有任何解决方法来实现这种行为?
感谢您的阅读。
答案 0 :(得分:1)
查看结果始终按键排序。因此,您应该将患者姓名添加到密钥中,然后您将进行排序。
小心将名称放在keys数组的正确位置,因为排序是词典编纂的,即如果名称将是最后一个组件,那么你将按名称排序所有打开的非活动状态,然后全部打开按名称排序等活动
如果您需要将名称键放在其他键的前面,但仍然能够过滤结果,那么您需要正确构建开始键和结束键,以便每个可能的患者的所有范围在过滤后面的键时将接受名称。 您必须提供一些肯定小于或大于任何可能的患者姓名的值。
在为Couchbase视图定义的key collation之后,null
将始终小于任何字符串,并且可以使用空地图{}
来匹配最后一个字符串。你基本上是在上一个样本中做到了。
如果要以反向模式查询视图,请不要忘记切换开始和结束键逻辑
要注意的另一件事是在更改逻辑或键集后总是递增视图的版本,否则您将继续获得旧的结果。增加版本将强制刷新视图,在视图函数中对所有数据执行更新的逻辑。