Android Couchbase Lite-按值排序映射/减少
广告:我正在使用CouchbaseLite Android 1.4.0,但我还没有准备好切换到2.0 要了解我的问题的背景:Android Couchbase Lite-按值排序映射/减少,android,couchbase-lite,couchbase-view,Android,Couchbase Lite,Couchbase View,广告:我正在使用CouchbaseLite Android 1.4.0,但我还没有准备好切换到2.0 要了解我的问题的背景: 我有两种文档类型:患者和就诊 患者通过字段visitId 访问有startDateTime和endDateTime 如果endDateTime为空或缺失,则访问被视为“打开” 通过字段visitType 通过字段inactive 我想: 获取特定类型的所有开放和活动就诊的所有患者(id+姓名) 使用skip和limit 获取按名称排序的结果 我设法找到了所有正确的
- 我有两种文档类型:
和患者
就诊
- 患者通过字段
visitId
- 访问有
和startDateTime
endDateTime
- 如果
为空或缺失,则访问被视为“打开”endDateTime
- 通过字段
visitType
- 通过字段
inactive
- 获取特定类型的所有开放和活动就诊的所有患者(id+姓名)
- 使用
和skip
limit
- 获取按名称排序的结果
query.key
:
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.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);
}});
query.setStartKey(新的ArrayList(){{
添加(空);
添加(空);
添加(空);
添加(假);
添加(visitType);
}});
query.setEndKey(新的ArrayList(){{
添加(新的HashMap());
添加(新的HashMap());
添加(空);
添加(假);
添加(visitType);
}});
但这不会返回任何患者(result.size=0)
所以。。。我不知道如何实现我的目标。
我想到了一种按值排序的方法,但它似乎还不存在(我想应该等到2.0)。但是,他们有没有办法实现这种行为呢
感谢阅读。查看结果总是按键排序。因此,您应该将患者姓名添加到密钥中,然后进行排序 注意将名称放在keys数组的正确位置,因为排序是字典式的,也就是说,如果名称将是最后一个组件,那么您将按名称对所有打开的非活动进行排序,然后按名称e.t.c对所有打开的活动进行排序 如果您需要将姓名键放在其他键的前面,但仍然能够过滤结果,则需要正确构造开始键和结束键,以便在过滤后续键的同时接受所有可能的患者姓名。 您必须提供一些值,这些值肯定小于或大于任何可能的患者姓名 按照为Couchbase视图定义的映射,一个
null
将始终小于任何字符串,并且一个空映射{}
可用于匹配过去的最后一个字符串。在上一个示例中,您基本上做对了。
如果要在反向模式下查询视图,请不要忘记切换开始键和结束键逻辑
另一件需要注意的事情是,在更改视图的逻辑或键集后,始终增加视图的版本,否则将继续得到旧的结果。增加版本将强制刷新视图,在视图函数中对所有数据执行更新后的逻辑。刚刚注意到,这可能会有所不同:在第一个代码段和以后的代码段中,患者姓名的访问方式有两种:
patientDoc.getProperties().get
和patientDoc.get
另外,如果您更改了键,请确保您正在更改视图版本以触发视图刷新。或者在测试新的密钥集之前强制刷新视图感谢您注意到了这一点,但这只是一个“手工清理”错误的结果(我的代码比这些代码片段要详细一点,但想法就在这里)。我将更新我的代码片段以使用相同的逻辑。谢谢。我搞乱了钥匙的顺序,在最后加上了名字,效果很好。但是我添加了null
作为startKey和newhashmap()
作为endKey,因为null的值小于“”
,HashMap的值优于\0xffff
。你是对的,这是更好的方法。我将为其他人更新回复文本。
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.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);
}});