{"id":2979,"date":"2017-03-27T10:20:03","date_gmt":"2017-03-27T17:20:03","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2979"},"modified":"2025-06-13T20:20:24","modified_gmt":"2025-06-14T03:20:24","slug":"performance-enhancements-n1ql-couchbase-5-developer","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/","title":{"rendered":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build"},"content":{"rendered":"<p>N1QL in Couchbase has come a long way since it\u00a0was first introduced in Couchbase Server 4.0. \u00a0In Couchbase 5.0, things are taken to the next level in terms of performance. \u00a0In terms of the March 2017 Developer build of Couchbase 5.0, there are performance enhancements to N1QL in the flavor of index projection, enhancements to <code>COUNT<\/code> and\u00a0<code>DISTINCT<\/code>, and the much requested\u00a0<code>ORDER BY<\/code>,\u00a0<code>LIMIT<\/code>, and\u00a0<code>OFFSET<\/code> operators.<\/p>\n<p>So what in specific was done to enhance all of these areas and how can we make use of the changes?<\/p>\n<p><!--more--><\/p>\n<p>Let&#8217;s take index projection for example. \u00a0When creating an index, you can create one with any number of properties. \u00a0For example, take the following index:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">CREATE INDEX idx ON default(type, firstname, lastname);<\/pre>\n<p>The above statement will create a covering index on the\u00a0<code>default<\/code> Bucket for the\u00a0<code>type<\/code>, <code>firstname<\/code>, and\u00a0<code>lastname<\/code> properties of any given document.<\/p>\n<p>Now let&#8217;s say we created the following N1QL query to retrieve a few documents with the\u00a0<code>idx<\/code> index we had created:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT firstname\r\nFROM default\r\nWHERE type = 'person'<\/pre>\n<p>The above query would use the\u00a0<code>idx<\/code> index and return only the\u00a0<code>firstname<\/code>\u00a0property for every document that matches. \u00a0The concept of querying this way is nothing new, however, what happens\u00a0behind the scenes has changed. \u00a0You&#8217;ll notice that even though\u00a0our index has many keys, we&#8217;re only interested in a subset, or in this case two\u00a0keys.<\/p>\n<p>So what is happening and why is this important?<\/p>\n<p>In previous versions of Couchbase all keys of the index were taken into consideration regardless if only a subset were used. \u00a0As a result, more network, CPU, and memory were needed to accommodate what was happening. \u00a0Now this is not the case.<\/p>\n<p>So how do you know index projection is happening?<\/p>\n<p>Do an\u00a0<code>EXPLAIN<\/code> on the query that you&#8217;re running:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">EXPLAIN SELECT firstname\r\nFROM default\r\nWHERE type = 'person'<\/pre>\n<p>In the results you should see something regarding\u00a0<code>index_projection<\/code> that looks like the following:<\/p>\n<pre class=\"lang:default highlight:0 decode:true \">...\r\n\"index_projection\": {\r\n    \"entry_keys\": [\r\n        0,\r\n        1\r\n    ]\r\n},\r\n...<\/pre>\n<p>The\u00a0<code>entry_keys<\/code> property will change based on your query. \u00a0For example, what if we add\u00a0one\u00a0<code>WHERE<\/code> condition like so?:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT firstname\r\nFROM default\r\nWHERE type = 'person' AND lastname = 'Nic'<\/pre>\n<p>In the above scenario, we would get an\u00a0<code>EXPLAIN<\/code> result that looks like the following:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">...\r\n\"index_projection\": {\r\n    \"entry_keys\": [\r\n        0,\r\n        1,\r\n        2\r\n    ]\r\n},\r\n...<\/pre>\n<p>Now the above query wasn&#8217;t an index projection because we used all keys in our covering index.<\/p>\n<p>Creating proper indexes paired with index projection can really help in overall performance and scaling your Couchbase Server cluster.<\/p>\n<p>Index projection wasn&#8217;t the only performance enhancement made in the March 2017 build right? \u00a0That is correct, there is more!<\/p>\n<p>Let&#8217;s take the\u00a0<code>COUNT(DISTINCT)<\/code> operation for example. \u00a0Now let&#8217;s use that operation in the following query:<\/p>\n<pre class=\"lang:default highlight:0 decode:true \">EXPLAIN SELECT COUNT(DISTINCT type)\r\nFROM default;<\/pre>\n<p>In the results you&#8217;ll notice that it is using\u00a0<code>IndexCountDistinctScan2<\/code> and what it is doing is storing all\u00a0<code>type<\/code> in the index and processing the distinct values. \u00a0While it happens in the indexer in Couchbase 5.0, it previously happened in the N1QL service in prior editions. \u00a0By offloading\u00a0this operation in the indexer, we can experience significant performance gains.<\/p>\n<p>Similarly, take the\u00a0<code>OFFSET<\/code>,\u00a0<code>LIMIT<\/code>, and\u00a0<code>ORDER BY<\/code> operators that can be used in N1QL queries. \u00a0Take the following query for example:<\/p>\n<pre class=\"lang:default highlight:0 decode:true \">EXPLAIN SELECT firstname\r\nFROM default\r\nWHERE type = 'person'\r\nORDER BY firstname\r\nLIMIT 1\r\nOFFSET 1;<\/pre>\n<p>You&#8217;ll notice that the\u00a0<code>LIMIT<\/code>, <code>ORDER BY<\/code>,\u00a0and\u00a0<code>OFFSET<\/code> operators will appear in the indexer. \u00a0Prior to 5.0, the <code>LIMIT<\/code> operator appeared in the indexer, but now the others do as well. \u00a0This is a huge win because in previous versions of Couchbase if you were to offset the results, N1QL would get all X number of results, and drop everything before the offset.<\/p>\n<p>For more help with N1QL, check out the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.6\/getting-started\/try-a-query.html\" target=\"_blank\">Couchbase Developer Portal<\/a> which contains a ton of useful developer documentation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N1QL in Couchbase has come a long way since it\u00a0was first introduced in Couchbase Server 4.0. \u00a0In Couchbase 5.0, things are taken to the next level in terms of performance. \u00a0In terms of the March 2017 Developer build of Couchbase [&hellip;]<\/p>\n","protected":false},"author":63,"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,9417,1812],"tags":[1888,1891],"ppma_author":[9032],"class_list":["post-2979","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-performance","category-n1ql-query","tag-5-0","tag-enhancement"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build<\/title>\n<meta name=\"description\" content=\"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.\" \/>\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\/performance-enhancements-n1ql-couchbase-5-developer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build\" \/>\n<meta property=\"og:description\" content=\"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-27T17:20:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:20:24+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build\",\"datePublished\":\"2017-03-27T17:20:03+00:00\",\"dateModified\":\"2025-06-14T03:20:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\"},\"wordCount\":563,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"5.0\",\"enhancement\"],\"articleSection\":[\"Couchbase Server\",\"High Performance\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\",\"name\":\"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-03-27T17:20:03+00:00\",\"dateModified\":\"2025-06-14T03:20:24+00:00\",\"description\":\"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#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\/performance-enhancements-n1ql-couchbase-5-developer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build","description":"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.","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\/performance-enhancements-n1ql-couchbase-5-developer\/","og_locale":"en_US","og_type":"article","og_title":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build","og_description":"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.","og_url":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-03-27T17:20:03+00:00","article_modified_time":"2025-06-14T03:20:24+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build","datePublished":"2017-03-27T17:20:03+00:00","dateModified":"2025-06-14T03:20:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/"},"wordCount":563,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["5.0","enhancement"],"articleSection":["Couchbase Server","High Performance","SQL++ \/ N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/","url":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/","name":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-03-27T17:20:03+00:00","dateModified":"2025-06-14T03:20:24+00:00","description":"The Couchbase Server 5.0 Developer Edition, March 2017 build, brings many bug fixes including performance enhancements to the N1QL technology.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/performance-enhancements-n1ql-couchbase-5-developer\/#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\/performance-enhancements-n1ql-couchbase-5-developer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Performance Enhancements to N1QL in the Couchbase 5.0 March Developer Build"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2979","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2979"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2979\/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=2979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2979"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}