Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Couchbase Lite-按值排序映射/减少_Android_Couchbase Lite_Couchbase View - Fatal编程技术网

Android Couchbase Lite-按值排序映射/减少

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 获取按名称排序的结果 我设法找到了所有正确的

广告:我正在使用CouchbaseLite Android 1.4.0,但我还没有准备好切换到2.0

要了解我的问题的背景:

  • 我有两种文档类型:
    患者
    就诊
  • 患者通过字段
    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);
}});