FHIR搜索中的GROUP BY式功能

时间:2018-06-18 16:46:26

标签: java hapi hl7-fhir hapi-fhir

我正在使用最新版本的HapiFHIR(服务器和客户端),它应符合HL7 FHIR标准。

作为我正在进行的项目的一部分,我需要检索每个设备的最新观察结果。有了SQL经验,我自然希望使用诸如GROUP BY之类的操作来实现这一目标。但是,通过阅读文档,似乎在HapiFHIR中没有这样的操作!

我错过了什么吗?如果没有,那么为每个设备检索最新的(sort by date, limit 1 )会有什么好的解决方法?

1 个答案:

答案 0 :(得分:1)

当您使用FHIR时,它有一个很好的REST搜索API,无需实现您自己的查询。

{{baseurl}}/Observation?device:Device=123&_sort=-_lastUpdated&_count=1

为您提供ID为123的最新设备观察结果。

FHIR search api

编辑,因为您还在使用HAPI客户端,您的查询代码如下所示:

Bundle results = myFhirCtx.newRestfulGenericClient("yourFHIRbaseURL")
        .search()
        .forResource(Observation.class)
        .where(Observation.DEVICE.hasId("123"))
        .sort().descending(Observation.DATE)
        .count(1)
        .returnBundle(Bundle.class)
        .execute();

上面的GET搜索最新更新的设备观察,JAVA代码根据其日期获得最新的观察。我想你的意思是第二个。

已过时,因为这会返回所有设备的最新n观察,而不是每台设备都是N, 适用于多个设备:

如果您想一次查询多个设备,可以通过查询带有X型设备的Observations或最新的制造商或型号设备观察来聚合查询,请参阅:search parameters for the Device resource

如果要查询一组已知设备ID的最新n观察,可以使用OR运算符,它只是一个冒号。

{{baseurl}}/Observation?device:Device=123,345,678&_sort=-_lastUpdated&_count=n

在hapi客户端代码中:

    Bundle results = myFhirCtx.newRestfulGenericClient("ttt")
        .search()
        .forResource(Observation.class)
        .where(Observation.DEVICE.hasAnyOfIds(new ArrayList<String>(Arrays.asList("123", "345", "678" ))))
        .sort().descending(Observation.DATE)
        .count(n)
        .returnBundle(Bundle.class)
        .execute();

<强>结论

如果您想拥有设备子集中每个设备的最新观察结果,您可以:

  • 多次使用此示例的第一个查询
  • 或者如果您更喜欢单个REST调用,则可以在批处理包中批量处理这些GET调用,如下例所示:Batch Bundle search。这将返回一个批处理响应包,其中包含每个搜索的条目。