Couchbase Lite - 按值排序地图/减少

时间:2018-02-14 16:10:03

标签: android couchbase-lite couchbase-view

广告:我使用的是CouchbaseLite Android 1.4.0,我还没有准备好切换到2.0。

要了解我的问题:

  • 我有2种文档类型:PATIENT& VISIT
  • 患者与字段visitId
  • 的访问有关
  • 访问时间为startDateTimeendDateTime
  • 如果endDateTime为空或缺少
  • ,则访问被视为“打开”
  • 通过字段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);
    }
}

THE QUERY

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)。但他们是否有任何解决方法来实现这种行为?

感谢您的阅读。

1 个答案:

答案 0 :(得分:1)

查看结果始终按键排序。因此,您应该将患者姓名添加到密钥中,然后您将进行排序。

小心将名称放在keys数组的正确位置,因为排序是词典编纂的,即如果名称将是最后一个组件,那么你将按名称排序所有打开的非活动状态,然后全部打开按名称排序等活动

如果您需要将名称键放在其他键的前面,但仍然能够过滤结果,那么您需要正确构建开始键和结束键,以便每个可能的患者的所有范围在过滤后面的键时将接受名称。 您必须提供一些肯定小于或大于任何可能的患者姓名的值。

在为Couchbase视图定义的key collation之后,null将始终小于任何字符串,并且可以使用空地图{}来匹配最后一个字符串。你基本上是在上一个样本中做到了。 如果要以反向模式查询视图,请不要忘记切换开始和结束键逻辑

要注意的另一件事是在更改逻辑或键集后总是递增视图的版本,否则您将继续获得旧的结果。增加版本将强制刷新视图,在视图函数中对所有数据执行更新的逻辑。