{"id":2446,"date":"2016-12-04T22:01:08","date_gmt":"2016-12-04T22:01:08","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2446"},"modified":"2023-11-22T14:37:02","modified_gmt":"2023-11-22T22:37:02","slug":"elt-processing-with-couchbase-and-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/","title":{"rendered":"ELT processing with Couchbase and N1QL"},"content":{"rendered":"<p>Moving data between data sources. This is one of the key activities in data integration projects. Traditionally, techniques around data movement has been part of <a href=\"https:\/\/www.couchbase.com\/blog\/database-vs-data-warehouse\/\">Data Warehouse<\/a>, BI and analytics. More recently Big Data, Data Lakes, Hadoop, are frequent players in this area.<\/p>\n<p>In this entry, we will discuss how Couchbase N1QL language can be used to make massive manipulation on the data in this kind of scenarios.<\/p>\n<p>First, let us remember the two classical approaches when doing data movement:<\/p>\n<p><strong>ETL<\/strong> (Extract-Transform-Load). With this model the data is <strong>extracted<\/strong> (from the original data source), <strong>transformed<\/strong> (data is reformatted to fit in the target system) and <strong>loaded<\/strong> (in the target data store).<\/p>\n<p><strong>ELT<\/strong> (Extract- Load-Transform). With this model the data is <strong>extracted<\/strong> (from the original data source), <strong>loaded<\/strong> in the same format in the target system. Then we do a <strong>transformation<\/strong> in the target system to obtain the desired data format.<\/p>\n<p>We will focus in a <strong>ELT<\/strong> exercise in this example. Let us do a simple export from a relational database, and load the data into Couchbase. We will use Oracle Database as input data source, with the classical HR schema example built in, which models a Human Resources department.<\/p>\n<p>This is the source data model:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/december\/elt-processing-with-couchbase-and-n1ql\/model_1.jpg\" \/><\/p>\n<p>In the first step, we will load the data with the same structure. There is a free tool you can use to perform this initial migration <a href=\"https:\/\/github.com\/mahurtado\/oracle2couchbase\">here<\/a>. At the end, we will have JSON documents mapping this table model:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/december\/elt-processing-with-couchbase-and-n1ql\/model_2.jpg\" \/><\/p>\n<p>For example, a location document will look like this:<\/p>\n<pre><code>{\r\n  \"street_address\": \"2017 Shinjuku-ku\",\r\n  \"city\": \"Tokyo\",\r\n  \"state_province\": \"Tokyo Prefecture\",\r\n  \"postal_code\": \"1689\",\r\n  \"type\": \"locations\",\r\n  \"location_id\": 1200,\r\n  \"country_id\": \"JP\"\r\n}\r\n<\/code><\/pre>\n<p>This was an easy first step. However, this mapping table-to-document is often a bad design in the NoSQL world. In NoSQL is frequent to de-normalize your data in favour of a more direct access path, embedding referenced data. The goal is to minimize database interactions and joins, looking for the best performance.<\/p>\n<p>Let us assume that our use case is driven by a frequent access to the whole job history for employees. We decide to change our design to this one:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/december\/elt-processing-with-couchbase-and-n1ql\/model_3.jpg\" \/><\/p>\n<p>For locations, we are joining in a single location document the referenced data for country and region.<\/p>\n<p>For the employee document, we will embed the department data, and will include an array with the whole job history or each employee. This array support in JSON is a good improvement over foreign key references and joins in the relational world.<\/p>\n<p>For the job document, we will maintain the original table structure.<\/p>\n<p>So we have <strong>extracted<\/strong> and <strong>loaded<\/strong> the data, now we will <strong>transform<\/strong> into this model to finish our <strong>ELT<\/strong> example. How can we do this job? It is time for N1QL<\/p>\n<p>N1QL is the SQL-like language included with Couchbase for data access and data manipulation. In this example, we will use two buckets: HR, which maps to the original Oracle HR schema, and HR_DNORM which will hold our target document model.<\/p>\n<p>We have already loaded our HR schema. Next step is to create a bucket named HR_DNORM. Then we will create a primary index in this new bucket:<\/p>\n<pre><code>CREATE PRIMARY INDEX ON HR_DNORM<\/code><\/pre>\n<p>Now it is time for creating the location documents. This documents are composed of original locations, country and region documents:<\/p>\n<pre><code>INSERT INTO HR_DNORM (key _k, value _v) \r\nSELECT meta().id _k,\r\n{\r\n   \"type\":\"location\",\r\n   \"city\":loc.city,\r\n   \"postal_code\":loc.postal_code, \r\n   \"state_province\":IFNULL(loc.state_province, null), \r\n   \"street_address\":loc.street_address, \r\n   \"country_name\":ct.country_name, \r\n   \"region_name\":rg.region_name\r\n } as _v\r\nFROM HR loc\r\nJOIN HR ct ON KEYS \"countries::\" || loc.country_id\r\nJOIN HR rg ON KEYS \"regions::\" || TO_STRING(ct.region_id)\r\nWHERE loc.type=\"locations\"<\/code><\/pre>\n<p>Few things to notice:<\/p>\n<ul>\n<li>We are using here the projection of a SELECT statement\u00a0to make the insert. In this example, the original data comes from a different bucket.<\/li>\n<li>JOINs are used in the original bucket to reference countries and regions<\/li>\n<li>IFNULL function used to set explicitly null value for the field state_province<\/li>\n<li>TO_STRING function applied on a number field to reference a key<\/li>\n<\/ul>\n<p>Our original sample becomes this:<\/p>\n<pre><code>{\r\n  \"city\": \"Tokyo\",\r\n  \"country_name\": \"Japan\",\r\n  \"postal_code\": \"1689\",\r\n  \"region_name\": \"Asia\",\r\n  \"state_province\": \"Tokyo Prefecture\",\r\n  \"street_address\": \"2017 Shinjuku-ku\",\r\n  \"type\": \"location\"\r\n}<\/code><\/pre>\n<p>Note we got rid of our references location_id and country_id.<\/p>\n<p>Now it is time for our employee documents. We will do it in several steps. First one is to create the employees from the original HR bucket, including department and actual job information:<\/p>\n<pre><code>INSERT INTO HR_DNORM (key _k, value _v) \r\nSELECT meta().id _k,\r\n{\r\n   \"type\":\"employees\",\r\n   \"employee_id\": emp. employee_id,\r\n   \"first_name\": emp.first_name,\r\n   \"last_name\": emp.last_name,\r\n   \"phone_number\": emp.phone_number,\r\n   \"email\": emp.email,\r\n   \"hire_date\": emp.hire_date,\r\n   \"salary\": emp.salary,\r\n   \"commission_pct\": IFNULL(emp.commission_pct, null),\r\n   \"manager_id\": IFNULL(emp.manager_id, null),\r\n   \"job_id\": emp.job_id,\r\n   \"job_title\": job.job_title,\r\n   \"department\" : \r\n   {\r\n      \"name\" : dpt.department_name,\r\n      \"manager_id\" : dpt.manager_id,\r\n      \"department_id\" : dpt.department_id\r\n   }  \r\n } as _v\r\nFROM HR emp\r\nJOIN HR job ON KEYS \"jobs::\" || emp.job_id \r\nJOIN HR dpt ON KEYS \"departments::\" || TO_STRING(emp.department_id) \r\nWHERE emp.type=\"employees\" RETURNING META().id;<\/code><\/pre>\n<p>Second, we will use a temporary construction to build the job history array:<\/p>\n<pre><code>INSERT INTO HR_DNORM (key _k, value job_history) \r\nSELECT \"job_history::\" || TO_STRING(jobh.employee_id) AS _k, \r\n{\r\n\"jobs\" : ARRAY_AGG(\r\n   {\r\n      \"start_date\": jobh.start_date,\r\n      \"end_date\": jobh.end_date,\r\n      \"job_id\": jobh.job_id,\r\n      \"department_id\": jobh.department_id\r\n   } \r\n)\r\n} AS job_history\r\nFROM HR jobh\r\nWHERE jobh.type=\"job_history\"\r\nGROUP BY jobh.employee_id\r\nRETURNING META().id;<\/code><\/pre>\n<p>Now is easy to update our employees documents adding a job_history array:<\/p>\n<pre><code>UPDATE HR_DNORM emp\r\nSET job_history=(\r\n   SELECT RAW jobs\r\n   FROM HR_DNORM jobh\r\n   USE KEYS \"job_history::\" || SUBSTR(meta(emp).id, 11)\r\n)[0]\r\nWHERE \r\nemp.type=\"employees\"\r\nRETURNING meta().id<\/code><\/pre>\n<p>This is how our employee document looks like:<\/p>\n<pre><code>{\r\n  \"commission_pct\": null,\r\n  \"department\": {\r\n    \"department_id\": 10,\r\n    \"manager_id\": 200,\r\n    \"name\": \"Administration\"\r\n  },\r\n  \"email\": \"JWHALEN\",\r\n  \"employee_id\": 200,\r\n  \"first_name\": \"Jennifer\",\r\n  \"hire_date\": \"2003-09-16T22:00:00Z\",\r\n  \"job_history\": [\r\n    {\r\n      \"department_id\": 80,\r\n      \"end_date\": \"2007-12-31T23:00:00Z\",\r\n      \"job_id\": \"SA_REP\",\r\n      \"start_date\": \"2006-12-31T23:00:00Z\"\r\n    },\r\n    {\r\n      \"department_id\": 90,\r\n      \"end_date\": \"2001-06-16T22:00:00Z\",\r\n      \"job_id\": \"AD_ASST\",\r\n      \"start_date\": \"1995-09-16T22:00:00Z\"\r\n    },\r\n    {\r\n      \"department_id\": 90,\r\n      \"end_date\": \"2006-12-30T23:00:00Z\",\r\n      \"job_id\": \"AC_ACCOUNT\",\r\n      \"start_date\": \"2002-06-30T22:00:00Z\"\r\n    }\r\n  ],\r\n  \"job_id\": \"AD_ASST\",\r\n  \"job_title\": \"Administration Assistant\",\r\n  \"last_name\": \"Whalen\",\r\n  \"manager_id\": 101,\r\n  \"phone_number\": \"515.123.4444\",\r\n  \"salary\": 4400,\r\n  \"type\": \"employees\"\r\n}<\/code><\/pre>\n<p>Note the job_history array of previous positions.<\/p>\n<p>We can delete now the temporary job_history documents:<\/p>\n<pre><code>DELETE FROM HR_DNORM emp\r\nWHERE meta().id LIKE \"job_history::%\"<\/code><\/pre>\n<p>As last step we insert the original jobs documents:<\/p>\n<pre><code>INSERT INTO HR_DNORM (key _k, value _v) \r\nSELECT meta().id _k, _v\r\nFROM HR _v\r\nWHERE _v.type=\"jobs\"<\/code><\/pre>\n<p>We are done. This is a simple example, but shows can powerful can be N1QL data manipulation. Happy data migration!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Moving data between data sources. This is one of the key activities in data integration projects. Traditionally, techniques around data movement has been part of Data Warehouse, BI and analytics. More recently Big Data, Data Lakes, Hadoop, are frequent players [&hellip;]<\/p>\n","protected":false},"author":69,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1819],"tags":[1766,1383],"ppma_author":[9041],"class_list":["post-2446","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-data-modeling","tag-data-migration","tag-etl"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ELT processing with Couchbase and N1QL - The Couchbase Blog<\/title>\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\/elt-processing-with-couchbase-and-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ELT processing with Couchbase and N1QL\" \/>\n<meta property=\"og:description\" content=\"Moving data between data sources. This is one of the key activities in data integration projects. Traditionally, techniques around data movement has been part of Data Warehouse, BI and analytics. More recently Big Data, Data Lakes, Hadoop, are frequent players [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-04T22:01:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-22T22:37:02+00:00\" \/>\n<meta name=\"author\" content=\"Manuel Hurtado, Solutions Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manuel Hurtado, Solutions Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\"},\"author\":{\"name\":\"Manuel Hurtado, Solutions Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/00c164bc72955b52cd86c966aafb9237\"},\"headline\":\"ELT processing with Couchbase and N1QL\",\"datePublished\":\"2016-12-04T22:01:08+00:00\",\"dateModified\":\"2023-11-22T22:37:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\"},\"wordCount\":731,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Data Migration\",\"ETL\"],\"articleSection\":[\"Couchbase Server\",\"Data Modeling\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\",\"name\":\"ELT processing with Couchbase and N1QL - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-12-04T22:01:08+00:00\",\"dateModified\":\"2023-11-22T22:37:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#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\/elt-processing-with-couchbase-and-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ELT processing with Couchbase and N1QL\"}]},{\"@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\/00c164bc72955b52cd86c966aafb9237\",\"name\":\"Manuel Hurtado, Solutions Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d792e93660734cc10c1f8a5bbc2cf29a\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e8eced6ee14aeefdf82ebfb694cfa145280c2e206f819d892eb82d5fef8a6a25?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e8eced6ee14aeefdf82ebfb694cfa145280c2e206f819d892eb82d5fef8a6a25?s=96&d=mm&r=g\",\"caption\":\"Manuel Hurtado, Solutions Engineer, Couchbase\"},\"description\":\"Manuel is a Couchbase Solutions Engineer, with more than 15 years of experience helping companies to architect their systems, as developer, consultant, trainer and project manager. Happy to learn from the field how people use technology to success.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/manuel-hurtado\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ELT processing with Couchbase and N1QL - The Couchbase Blog","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\/elt-processing-with-couchbase-and-n1ql\/","og_locale":"en_US","og_type":"article","og_title":"ELT processing with Couchbase and N1QL","og_description":"Moving data between data sources. This is one of the key activities in data integration projects. Traditionally, techniques around data movement has been part of Data Warehouse, BI and analytics. More recently Big Data, Data Lakes, Hadoop, are frequent players [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-12-04T22:01:08+00:00","article_modified_time":"2023-11-22T22:37:02+00:00","author":"Manuel Hurtado, Solutions Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Manuel Hurtado, Solutions Engineer, Couchbase","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/"},"author":{"name":"Manuel Hurtado, Solutions Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/00c164bc72955b52cd86c966aafb9237"},"headline":"ELT processing with Couchbase and N1QL","datePublished":"2016-12-04T22:01:08+00:00","dateModified":"2023-11-22T22:37:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/"},"wordCount":731,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Data Migration","ETL"],"articleSection":["Couchbase Server","Data Modeling"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/","name":"ELT processing with Couchbase and N1QL - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-12-04T22:01:08+00:00","dateModified":"2023-11-22T22:37:02+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/elt-processing-with-couchbase-and-n1ql\/#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\/elt-processing-with-couchbase-and-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ELT processing with Couchbase and N1QL"}]},{"@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\/00c164bc72955b52cd86c966aafb9237","name":"Manuel Hurtado, Solutions Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d792e93660734cc10c1f8a5bbc2cf29a","url":"https:\/\/secure.gravatar.com\/avatar\/e8eced6ee14aeefdf82ebfb694cfa145280c2e206f819d892eb82d5fef8a6a25?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e8eced6ee14aeefdf82ebfb694cfa145280c2e206f819d892eb82d5fef8a6a25?s=96&d=mm&r=g","caption":"Manuel Hurtado, Solutions Engineer, Couchbase"},"description":"Manuel is a Couchbase Solutions Engineer, with more than 15 years of experience helping companies to architect their systems, as developer, consultant, trainer and project manager. Happy to learn from the field how people use technology to success.","url":"https:\/\/www.couchbase.com\/blog\/author\/manuel-hurtado\/"}]}},"authors":[{"term_id":9041,"user_id":69,"is_guest":0,"slug":"manuel-hurtado","display_name":"Manuel Hurtado, Solutions Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/e8eced6ee14aeefdf82ebfb694cfa145280c2e206f819d892eb82d5fef8a6a25?s=96&d=mm&r=g","author_category":"","last_name":"Hurtado","first_name":"Manuel","job_title":"","user_url":"","description":"Manuel is a Couchbase Solutions Engineer, with more than 15 years of experience helping companies to architect their systems, as developer, consultant, trainer and project manager. Happy to learn from the field how people use technology to success."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2446","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\/69"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2446"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2446\/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=2446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2446"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}