couchbase Lite-排序地图/按值降低



广告:我正在使用couchbaselite android 1.4.0,我还没有准备好切换到2.0。

获取我的问题的上下文:

  • 我有2种文档类型:PATIENT&VISIT
  • 患者与访问visitId的访问有关
  • 访问有startDateTimeendDateTime
  • 如果endDateTime为null或缺少
  • ,则将访问视为"打开">
  • 通过字段visitType
  • ,访问可以是不同类型的访问
  • 访问可以通过字段inactive
  • 进行访问

我想:

  • 让所有类型的所有开放和主动访问中的所有患者(ID 名称(
  • 结果是使用skiplimit
  • 分页的
  • 获取结果按名称
  • 排序

我设法获得了所有正确的患者并为结果划分了结果,但问题是分类。由于分页为分页,我无法进行"帖子排序"(按随机顺序获取结果,然后使用自制方法进行分类(。

所以这是它实际上在没有排序的情况下工作的方式:

地图/降低

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);
}});

,但这没有病人(结果= 0(

所以...我不知道如何实现我的目标。我竭尽全力按值进行排序,但似乎还不存在(我认为应该等待2.0(。但是他们的解决方案是实现这种行为吗?

感谢阅读。

视图结果始终按键排序。因此,您应该将患者名称添加到键,然后将其分类。

要小心将名称放入键阵列的正确位置,因为排序是词典,即如果名称将是最后一个组件,那么您将获得所有按名称排序的not活动,然后全部打开主动用名称E.T.C。

排序

如果您需要将姓名密钥放在其他键前,但仍然能够过滤您的结果,那么您将需要正确构建start键和结束键,以便每个可能的患者的全部范围将在后来的密钥被过滤时接受名称。您将必须提供一些肯定比任何可能的患者名称的值。

遵循为Couchbase视图定义的键排列,null始终小于任何字符串,并且可以使用一个空的MAP {}来匹配最后一个字符串。您基本上是在上一个样本中进行的。如果您想以反向模式查询视图

,请不要忘记切换启动和结束键逻辑

要考虑的另一件事是在更改其逻辑或密钥集后始终增加视图的版本,否则您将继续获得旧的结果。增加版本将迫使视图刷新,并在所有数据上执行更新的逻辑。

最新更新