{"id":8759,"date":"2020-06-08T21:10:26","date_gmt":"2020-06-09T04:10:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8759"},"modified":"2025-06-13T17:21:42","modified_gmt":"2025-06-14T00:21:42","slug":"implement-fhir-rest-server-with-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/","title":{"rendered":"Implement FHIR REST server with Couchbase"},"content":{"rendered":"<p><span style=\"font-weight: 400\">This is a follow up to my previous post that covered the topic of FHIR Data Model with Couchbase N1QL. In this blog, I will discuss the topic of how to implement the FHIR Search REST API Server over the Couchbase services, including actual examples of how the different FHIR search patterns work with Couchbase using the synthetic FHIR data provided by Synthea.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Please refer to my previous blog for background information on <a href=\"https:\/\/www.couchbase.com\/blog\/fhir-data-model-with-couchbase-n1ql\/\">FHIR Data Model with Couchbase N1QL<\/a>.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Why is this of interest to you<\/span><\/h2>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Your organization is planning to develop an FHIR compliant Electronic Health Record system (EHR), and you are looking into taking advantage of the many benefits of NoSQL databases, such as Distributed, High Availability, XDCR, and Multi-Dimensional Scalability.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">You are an architect, or developer and like understand how Couchbase JSON database can greatly reduce the complexity of your applications, by relegating the complex FHIR Search\u00a0 [<\/span><a href=\"https:\/\/www.hl7.org\/fhir\/searchparameter-registry.html\"><span style=\"font-weight: 400\">https:\/\/www.hl7.org\/fhir\/searchparameter-registry.html<\/span><\/a><span style=\"font-weight: 400\">] processing to the database server layer.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">You are a data analyst and like to understand how you can leverage your SQL knowledge to query FHIR data directly with <\/span><a href=\"https:\/\/www.couchbase.com\/products\/n1ql\/\"><span style=\"font-weight: 400\">Couchbase N1Q<\/span><\/a><span style=\"font-weight: 400\">L and <\/span><a href=\"https:\/\/www.couchbase.com\/products\/full-text-search\/\"><span style=\"font-weight: 400\">Full-Text-Search.<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">You are interested in finding out how Couchbase N1QL, a SQL for JSON, can provide an efficient way to query a JSON data modelt hat is both hierarchical and relational in nature, as defined by <a href=\"https:\/\/www.hl7.org\/fhir\/administration-module.html\">HL7 Administrative Module<\/a>.<\/span><\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400\">FHIR Application with Couchbase<\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8768\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM.png\" alt=\"\" width=\"990\" height=\"604\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM.png 2190w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-300x183.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-1024x625.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-768x469.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-1536x937.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-2048x1249.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM-1320x805.png 1320w\" sizes=\"auto, (max-width: 990px) 100vw, 990px\" \/><\/p>\n<p><span style=\"font-weight: 400\">The diagram above shows the processes involved in a typical FHIR application. The FHIR Rest server is central to this application, and needs to support the search specifications\u00a0 as specified by FHIR <\/span><a href=\"https:\/\/www.hl7.org\/fhir\/search.html\"><span style=\"font-weight: 400\">https:\/\/www.hl7.org\/fhir\/search.html<\/span><\/a><span style=\"font-weight: 400\">. The REST server manages all the interactions between the client applications and translates the FHIR search requests into N1QL statements, and submits the requests to the Couchbase Query Service.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">How to set up the FHIR Server with Couchbase<\/span><\/h2>\n<p><span style=\"font-weight: 400\">You can set up the Couchbase FHIR API server, and the Couchbase NoSQL database on a single server, or even your laptop. The setup process requires:<\/span><\/p>\n<ol>\n<li>Installing Couchbase Server 6.5.<\/li>\n<li>Load the Synthea Data into the Couchbase Server.<\/li>\n<li>Deploy the dotnet FHIR Server code.<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Please follow the instructions <\/span><a href=\"https:\/\/github.com\/AV25242\/dotnet-fhir-server-couchbase.git\"><span style=\"font-weight: 400\">https:\/\/github.com\/AV25242\/dotnet-fhir-server-couchbase.git<\/span><\/a><\/p>\n<h2><span style=\"font-weight: 400\">FHIR Sample Data Set<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Before you start using FHIR search to query, let\u2019s familiarize ourselves with the FHIR sample data set.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The Synthea data set consists of 1K synthetic patient records.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The patient record is in a FHIR resource bundle format, meaning a patient record includes all of the patient\u2019s related FHIR objects.<\/span><\/li>\n<\/ol>\n<pre class=\"theme:github lang:default decode:true\">\"Practitioner\"\r\n\"ImagingStudy\"\r\n\"MedicationRequest\"\r\n\"Condition\"\r\n\"Device\"\r\n\"DiagnosticReport\"\r\n\"CarePlan\"\r\n\"Encounter\"\r\n\"CareTeam\"\r\n\"Claim\"\r\n\"Procedure\"\r\n\"Immunization\"\r\n\"Observation\"\r\n\"MedicationAdministration\"\r\n\"Organization\"\r\n\"Goal\"\r\n\"ExplanationOfBenefit\"\r\n\"AllergyIntolerance\"<\/pre>\n<p>For the purpose of this demonstration, the patient resource bundle have been normalized into individual resource type documents, to allow us to query the FHIR object directly or indirectly via the reference id of the object.<\/p>\n<div id=\"attachment_8761\" style=\"width: 1051px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8761\" class=\"wp-image-8761\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM.png\" alt=\"FHIR Administrative Data Model\" width=\"1041\" height=\"755\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM.png 1151w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM-300x218.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM-1024x743.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM-768x557.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-04-07-at-4.30.12-PM-20x15.png 20w\" sizes=\"auto, (max-width: 1041px) 100vw, 1041px\" \/><p id=\"caption-attachment-8761\" class=\"wp-caption-text\">The FHIR model is shown with relationships to convey that<\/p><\/div>\n<h2><span style=\"font-weight: 400\">FHIR searches<\/span><\/h2>\n<p><span style=\"font-weight: 400\">You can test out the REST API server using any REST clients of your choice. For simplicity, I use CURL on my terminal.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">1. Search any FHIR resource<\/span><\/h4>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient<\/pre>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Practitioner<\/pre>\n<h4><span style=\"font-weight: 400\">2. Search resource by id<\/span><\/h4>\n<p><span style=\"font-weight: 400\">All FHIR resources have an id identifier, and can be searched directly.<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient\/8850c4aa-cb77-4659-8373-980882405846<\/pre>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient?id=8850c4aa-cb77-4659-8373-980882405846<\/pre>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Organization?id=d32bd7bd-4211-34d8-a08b-b1b2b810d41b<\/pre>\n<h4><span style=\"font-weight: 400\">3. Search resource by any top level field<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Search all insurance Claims that were provided by \u201cBAYSIDE MEDICAL CENTER\u201d<\/span><\/p>\n<pre class=\"lang:default decode:true \">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Claim?provider.display=BAYSTATE MEDICAL CENTER<\/pre>\n<h4><span style=\"font-weight: 400\">4. Search resource by name\u00a0 &#8211;\u00a0 N1QL ARRAY Search<\/span><\/h4>\n<p><span style=\"font-weight: 400\">The FHIR resource has a comprehensive structure to capture the resource name.<\/span><\/p>\n<pre class=\"theme:github lang:js decode:true\">\"name\": [\r\n        {\r\n            \"family\": \"Wizard\",\r\n            \"given\": [\r\n                     \"Buffy\"\r\n            ],\r\n            \"prefix\": [1 item],\r\n            \"use\": \"official\"\r\n        },\r\n        {\r\n            \"family\": \"Schneider\",\r\n            \"given\": [\r\n                     \"Tootsie\"\r\n            ],\r\n            \"prefix\": [1 item],\r\n            \"use\": \"maiden\"\r\n        }\r\n]\r\n<\/pre>\n<p><span style=\"font-weight: 400\">The FHIR search on name has to take into account all the different names the patient may use.<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient\/?name=Buffy<\/pre>\n<h4><span style=\"font-weight: 400\">5. Search Patients by Medical Identifier &#8211; N1QL ARRAY Search<\/span><\/h4>\n<p><span style=\"font-weight: 400\">FHIR also supports identifiers for the resource. In the example below, a patient can be identified with his\/her SSN and OID (for non-FHIR systems).\u00a0<\/span><\/p>\n<pre class=\"theme:github whitespace-before:1 whitespace-after:1 lang:js decode:true \">\"patient\": {\r\n           \"address\": [1 item],\r\n           \"birthDate\": \"1946-11-29\",\r\n           \"communication\": [1 item],\r\n           \"deceasedDateTime\": \"1983-03-25T09:56:18-08:00\",\r\n           \"extension\": [7 items],\r\n           \"gender\": \"female\",\r\n           \"id\": \"b495844d-22d0-4045-a00d-99f6799df265\",\r\n           \"identifier\": [\r\n                   {2 items},\r\n                   {3 items},\r\n                   {\r\n                       \"system\": \"https:\/\/hl7.org\/fhir\/sid\/us-ssn\",\r\n                       \"type\": {2 items},\r\n                       \"value\": \"999-46-2135\"\r\n                   },\r\n                   {\r\n                       \"system\": \"urn:oid:2.16.840.1.113883.4.3.25\",\r\n                       \"type\": {2 items},\r\n                       \"value\": \"S99963447\"\r\n                   },\r\n                   {3 items}\r\n            ],\r\n            \"maritalStatus\": {2 items},\r\n            \"multipleBirthBoolean\": false,\r\n            \"name\": [1 item],\r\n            \"resourceType\": \"Patient\",\r\n            \"telecom\": [1 item],\r\n            \"text\": {2 items}\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search Patient by the SSN identifier<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient?identifier=https:\/\/hl7.org\/fhir\/sid\/us-ssn|999-46-2135\r\n<\/pre>\n<h4><span style=\"font-weight: 400\">6. Search resource by medical system\/code &#8211; N1QL ARRAY Search<\/span><\/h4>\n<p><span style=\"font-weight: 400\">FHIR uses the medical code to identify Procedure, Observation, or DiagnosticReport.<\/span><\/p>\n<pre class=\"theme:github lang:default decode:true\">\"diagnosticreport\": {\r\n    \"category\": [1 item],\r\n    \"code\": {\r\n        \"coding\": [\r\n            {\r\n                \"code\": \"57698-3\",\r\n                \"display\": \"Lipid Panel\",\r\n                \"system\": \"https:\/\/loinc.org\"\r\n            }\r\n        ],\r\n        \"text\": \"Lipid Panel\"\r\n    },\r\n    \"effectiveDateTime\": \"2016-08-17T14:24:27-07:00\",\r\n    \"encounter\": {1 item},\r\n    \"id\": \"38f2e919-894c-4277-ba00-372c18c9cced\",\r\n    \"issued\": \"2016-08-17T14:24:27.878-07:00\",\r\n    \"resourceType\": \"DiagnosticReport\",\r\n    \"result\": [4 items],\r\n    \"status\": \"final\",\r\n    \"subject\": {1 item}\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search DiagnosticReport by its system &amp; code<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/DiagnisticReport?code=https:\/\/loinc.org|57698-3<\/pre>\n<h4><span style=\"font-weight: 400\">7. Search resource by Phone \/ Email &#8211; N1QL ARRAY Search<\/span><\/h4>\n<p><span style=\"font-weight: 400\">FHIR record encapsulates all the communication channels to the resource in the \u201ctelecom\u201d field.<\/span><\/p>\n<pre class=\"theme:github lang:default decode:true\">\"telecom\": [\r\n    {\r\n        \"system\": \"email\",\r\n        \"use\": \"work\",\r\n        \"value\": \"Quinton758.Hammes673@example.com\"\r\n    },\r\n    {  \r\n         \"system\": \"phone\",\r\n         \"use\": \"home\",\r\n         \"value\": \"555-270-6484\"\r\n    }\r\n]\r\n<\/pre>\n<p><span style=\"font-weight: 400\">The FHIR search on telecom\u00a0 has to take into account all the different telecom types the resource may use.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Search Patients by phone<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient\/?phone=555-270-6484\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search Practitioners by email<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Practioner\/?email=Quinton758.Hammes673@example.com<\/pre>\n<p><span style=\"font-weight: 400\">Search Hospitals by phone<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Organization\/?phone=978-524-7933<\/pre>\n<h4><span style=\"font-weight: 400\">8. Search resource using Date Range &#8211; N1QL Range Scan<\/span><\/h4>\n<p><span style=\"font-weight: 400\">FHIR objects may include a datetime range to indicate the period in which an event occurred.<\/span><\/p>\n<pre class=\"theme:github lang:default decode:true\">\"performedPeriod\": {\r\n    \"end\": \"2011-07-06T23:03:22-07:00\",\r\n    \"start\": \"2011-07-06T22:48:22-07:00\"\r\n},\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search Procedures that took place between two dates<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Procedure?performedPeriod.start=ge2011-07-07&amp;performedPeriod.end=le2011-07-08\r\n<\/pre>\n<h4><span style=\"font-weight: 400\">9. Search resource with _text search &#8211; Couchbase FTS<\/span><\/h4>\n<p><span style=\"font-weight: 400\">FHIR search specification also includes a text search capability. A search request using the \u2018_text\u2019 field will instruct the server to perform a text search on all the text field.<\/span><\/p>\n<pre class=\"theme:github lang:default decode:true\">\"condition\": {\r\n    \"abatementDateTime\": \"2019-06-01T20:53:48-07:00\",\r\n    \"clinicalStatus\": {1 item},\r\n    \"code\": {\r\n        \"coding\": [1 item],\r\n        \"text\": \"Fracture of ankle\"\r\n    },\r\n    \"encounter\": {1 item},\r\n    \"id\": \"f2e4b232-513c-4222-9568-6fbe096bb6ba\",\r\n    \"onsetDateTime\": \"2019-04-02T20:53:48-07:00\",\r\n    \"recordedDate\": \"2019-04-02T20:53:48-07:00\",\r\n    \"resourceType\": \"Condition\",\r\n    \"subject\": {1 item},\r\n    \"verificationStatus\": {1 item}\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search Conditions with the term \u2018Fracture\u2019 in text description.<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Condition?_text=Fracture\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search Observations with the term \u2018Cholesterol\u2019\u2019 in text description.<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Observation?_text=Cholesterol<\/pre>\n<h4><span style=\"font-weight: 400\">10. Search Patients by their related objects &#8211; N1QL JOIN<\/span><\/h4>\n<p><span style=\"font-weight: 400\">The FHIR data model is relational in nature. The objects that are associated with a Patient contain the Patient\u2019s id in the subject field.\u00a0 A patient has multiple CarePlans, and the plan has a subject field with the patient\u2019s id to denote that the care plan belongs to the patient.<\/span><\/p>\n<pre class=\"theme:github lang:default decode:true \">\"careplan\": {\r\n    \"activity\": [2 items],\r\n    \"addresses\": [1 item],\r\n    \"careTeam\": [1 item],\r\n    \"category\": [1 item],\r\n    \"encounter\": {1 item},\r\n    \"id\": \"49b2239e-da9c-447a-9e7c-f5721339cf2f\",\r\n    \"intent\": \"order\",\r\n    \"period\": {\r\n        \"start\": \"2015-03-22T21:38:17-07:00\"\r\n    },\r\n    \"resourceType\": \"CarePlan\",\r\n    \"status\": \"active\",\r\n    \"subject\": {\r\n        \"reference\": \"urn:uuid:9aa55fa8-0422-4ca4-bc22-099aea53a590\"\r\n    },\r\n    \"text\": {2 items}\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Using the subject.reference field, the FHIR REST server can implement a database JOIN between the Patient and the related objects, to allow a search for the patient record who owns a specific plan with a plan id value<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient?CarePlan.id=49b2239e-da9c-447a-9e7c-f5721339cf2f\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Search all Patients who had a particular Observation code<\/span><\/p>\n<pre class=\"lang:default decode:true\">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient?Observation.code=https:\/\/loinc.org|29463-7<\/pre>\n<p><span style=\"font-weight: 400\">Search all Patients who have had a s particular medical Condition<\/span><\/p>\n<pre class=\"lang:default decode:true \">&gt;curl -X GET https:\/\/&lt;fhir-server-ip&gt;\/Fhir\/api\/Patient?Condition.code.text=Hypertension<\/pre>\n<h2>Why Couchbase is a better platform to build your FHIR Server<\/h2>\n<p>A quick Google on FHIR Server returns 300K results, and the HL7 FHIR implementation page lists over dozen open source projects. Ready built FHIR server implementations are also available from <a href=\"https:\/\/www.google.com\/search?sxsrf=ALeKk0385lplEBi7dhPd8B8K4cF1n40Gkg%3A1591650155642&amp;ei=a6feXpXcJqK_0PEP_tOX0Ao&amp;q=fhir+server+product&amp;oq=fhir+server+product&amp;gs_lcp=CgZwc3ktYWIQAzIFCCEQoAEyBQghEKABMgUIIRCgATIFCCEQoAE6BwgAEEcQsAM6BAgjECc6AggAOgYIABAWEB46BwghEAoQoAFQhp0JWKujCWDGpgloAXAAeACAAXaIAdcFkgEDMi41mAEAoAEBqgEHZ3dzLXdpeg&amp;sclient=psy-ab&amp;ved=0ahUKEwjVvYjxjvPpAhWiHzQIHf7pBaoQ4dUDCAw&amp;uact=5\">many vendors<\/a>. These implementations rely on different database technologies from traditional RDBMS, as well as many of the current NoSQL databases in the market today.<\/p>\n<p>The <a href=\"https:\/\/github.com\/AV25242\/dotnet-fhir-server-couchbase\"><em>dotnot-fhir-server-couchbase<\/em><\/a> provides several examples on how you can build the FHIR search specifications using the Couchbase platform. The code translates the FHIR API search APIs and parameters into Couchbase N1QL statements, then submits them to the Couchbase Query service, where all the processing are processed. This approach can reduce the complexity in the REST server or the REST client application. A few key points to note:<\/p>\n<ol>\n<li>The FHIR JSON data are stored as-is in the Couchbase Data Service. There are no pre\/post processing required when you need to POST\/GET the FHIR document to\/from the server.<\/li>\n<li>Couchbase N1QL query language has a rich set of operations that support the processing of the hierarchical data of the FHIR JSON format. Allowing seamless access to nested array of data, such as those used to describe patient&#8217;s conditions, observations,\u00a0 treatments, and diagnostic reports.<\/li>\n<li>FHIR requirements for Text Search can be met directly in Couchbase Full Text Search with <a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/n1ql\/n1ql-language-reference\/searchfun.html\">N1QL Search()<\/a> function, there is no need to map your searches to Lucene, ElasticSearch or Solr.<\/li>\n<li>FHIR chained search specifications could require a FHIR server implementation to submit multiple searches to the database in order process the request. However with N1QL, an ANSI join query can result in a much simpler code to meet the requirement.<\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400\">Summary<\/span><\/h2>\n<p><span style=\"font-weight: 400\">FHIR Rest Servers are being implemented in all types of platforms.\u00a0 The search protocols are relatively simple, focusing on the support of retrieving Patient, and other FHIR related objects by their specific attributes. The search APIs insulate the REST client from complex hierarchical and array processing, which are fundamentals to JSON data format.\u00a0 However, the specification, as it is currently stands:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Does not define a clear way to allow querying of patients (or other FHIR objects) by its related information, other than a simple parent and child capability.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">There is no support for aggregation, thus limiting any analysis capabilities.<\/span><\/li>\n<\/ol>\n<p>Because of these limitations, the REST client applications can become more complex as it needs to embed the logic of traversing the FHIR data model.\u00a0 <span style=\"font-weight: 400\">The example REST Server API code in this blog article, seeks to illustrate three key points<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The simplicity of implementing searching on array elements using Couchbase N1QL array construct.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The ability to push down to the Couchbase Query service, to perform the search on Patient objects using related objects. In effect, leveraging N1QL ANSI JOIN supports.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The ability to seamlessly integrate Full Text Search capabilities with Couchbase N1QL, without the need to use dedicated FTS platforms such ElasticSearch or Solr, as suggested in the FHIR Search specification.<\/span><\/li>\n<\/ol>\n<p>I would also like to thank Arun Vijayraghavan, our Principal Product Manager for all Couchbase SDKs, who developed the <a href=\"https:\/\/github.com\/AV25242\/dotnet-fhir-server-couchbase.git\">dotnet-fhir-server-couchbase<\/a> code, and the feedback from customers who have helped reviewing our FHIR search implementation. Please let us know if you have any questions, feedback or running into any issue setting the environment.<\/p>\n<h3>Resources<\/h3>\n<ol>\n<li>Fast Healthcare Interoperability Resource:\u00a0<a href=\"https:\/\/www.hl7.org\/fhir\/index.html\">https:\/\/www.hl7.org\/fhir\/index.html<\/a><\/li>\n<li>SyntheticMass: \u201cJason Walonoski, Mark Kramer, Joseph Nichols, Andre Quina, Chris Moesel, Dylan Hall, Carlton Duffett, Kudakwashe Dube, Thomas Gallagher, Scott McLachlan, Synthea: An approach, method, and software mechanism for generating synthetic patients and the synthetic electronic health care record,\u00a0<em>Journal of the American Medical Informatics Association<\/em>, Volume 25, Issue 3, March 2018, Pages 230\u2013238,\u00a0<a href=\"https:\/\/doi.org\/10.1093\/jamia\/ocx079\">https:\/\/doi.org\/10.1093\/jamia\/ocx079<\/a>\u201c<\/li>\n<li>N1QL Tutorial:\u00a0<a href=\"https:\/\/query-tutorial.couchbase.com\/tutorial\/#1\">https:\/\/query-tutorial.couchbase.com\/tutorial\/#1<\/a><\/li>\n<li>FHIR Search Parameters:\u00a0<a href=\"https:\/\/www.hl7.org\/fhir\/searchparameter-registry.html\">https:\/\/www.hl7.org\/fhir\/searchparameter-registry.html<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>This is a follow up to my previous post that covered the topic of FHIR Data Model with Couchbase N1QL. In this blog, I will discuss the topic of how to implement the FHIR Search REST API Server over the [&hellip;]<\/p>\n","protected":false},"author":26326,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1821,1819,2165,1812],"tags":[4959],"ppma_author":[8919],"class_list":["post-8759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-architecture","category-data-modeling","category-full-text-search","category-n1ql-query","tag-fhir"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Implement FHIR REST server with Couchbase - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implement FHIR REST server with Couchbase\" \/>\n<meta property=\"og:description\" content=\"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-09T04:10:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:21:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2190\" \/>\n\t<meta property=\"og:image:height\" content=\"1336\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Binh Le\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Binh Le\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"Implement FHIR REST server with Couchbase\",\"datePublished\":\"2020-06-09T04:10:26+00:00\",\"dateModified\":\"2025-06-14T00:21:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\"},\"wordCount\":1556,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"FHIR\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Architecture\",\"Data Modeling\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\",\"name\":\"Implement FHIR REST server with Couchbase - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2020-06-09T04:10:26+00:00\",\"dateModified\":\"2025-06-14T00:21:42+00:00\",\"description\":\"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implement FHIR REST server with Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"caption\":\"Binh Le\"},\"description\":\"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Implement FHIR REST server with Couchbase - The Couchbase Blog","description":"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/","og_locale":"en_US","og_type":"article","og_title":"Implement FHIR REST server with Couchbase","og_description":"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.","og_url":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-06-09T04:10:26+00:00","article_modified_time":"2025-06-14T00:21:42+00:00","og_image":[{"width":2190,"height":1336,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Screen-Shot-2020-06-07-at-3.24.23-PM.png","type":"image\/png"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"Implement FHIR REST server with Couchbase","datePublished":"2020-06-09T04:10:26+00:00","dateModified":"2025-06-14T00:21:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/"},"wordCount":1556,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["FHIR"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Architecture","Data Modeling","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/","name":"Implement FHIR REST server with Couchbase - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2020-06-09T04:10:26+00:00","dateModified":"2025-06-14T00:21:42+00:00","description":"This post discusses the benefits of Couchbase N1QL for the implementation of FHIR Server. It includes sample code, and practical examples.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/implement-fhir-rest-server-with-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Implement FHIR REST server with Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7","url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","caption":"Binh Le"},"description":"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.","url":"https:\/\/www.couchbase.com\/blog\/author\/binh-le-2\/"}]}},"authors":[{"term_id":8919,"user_id":26326,"is_guest":0,"slug":"binh-le-2","display_name":"Binh Le","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","author_category":"","last_name":"Le","first_name":"Binh","job_title":"","user_url":"","description":"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Clould Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/8759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=8759"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/8759\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=8759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=8759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=8759"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=8759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}