$everything on Patient
Retrieve all FHIR resources related to a patient using the $everything operation with filtering parameters.
This operation returns all the information related to one or more patients described in the resource or context on which this operation is invoked. The response is a bundle. Returns resources that the server has that are related to the patient
Run Patient-everything:
GET [base]/Patient/[id]/$everything
Patient-everything supported parameters
| Query parameter | |
|---|---|
| _since | Include resources updated after the specified timestamp. |
| _timeout | Set timeout for every internal search. |
| _count | Limits return of each resource type. Partial support without pagination. |
Examples
Get all resources directly linked to the patient pt-1:
GET /Patient/pt-1/$everything
Get all resources directly linked to the patient pt-1 that were created or updated after Jan 1st 2021:
GET /Patient/pt-1/$everything?_since=2021-01-01T00:00:00Z
Performance note
$everything is a heavy operation that performs several SQL requests. If one of the request's duration is too long, the operation will fail due to timeout.
This can be fixed in two ways:
- Add
_timeout=<n-seconds>search parameter; - Optimize the request by adding an index.
Here's the list of search parameters that Aidbox uses to find everything about the patient.
select resource->'resource' from compartmentdefinition where id = 'patient'
For example, we suspect, that $everything operation is slow because we have a lot of Observations. The internal search for Observations that refer Patient is:
- code: Observation
param:
- subject
- performer
It will be transformed into:
GET /fhir/Observation?_filter=(subject eq Patient/pt1) or (performer eq Patient/pt1)
To debug this, we can query using _explain search parameter:
GET /fhir/Observation?_filter=(subject eq Patient/pt1) or (performer eq Patient/pt1)&_explain=1
And now we see the SQL and the PostgreSQL plan:
query:
- >-
SELECT "observation".* FROM "observation" WHERE (("observation".resource @>
?) OR ("observation".resource @> ?)) LIMIT ? OFFSET ?
- '{"subject":{"id":"Patient"}}'
- '{"performer":[{"id":"Patient"}]}'
- 100
- 0
plan: >-
<slow plan here>
Planning Time: 0.045 ms
Execution Time: 130.015 ms
The next step is to optimize the request.
See:
Last updated: