{"id":1893,"date":"2017-01-03T00:24:16","date_gmt":"2017-01-03T00:24:16","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1893"},"modified":"2025-06-13T23:43:33","modified_gmt":"2025-06-14T06:43:33","slug":"resolving-keys-embedded-within-json","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/","title":{"rendered":"Resolving Keys Embedded within JSON"},"content":{"rendered":"<p>A question came up today from a developer looking to migrate to Couchbase from something else.\u00a0 That \u201csomething else\u201d had a JSON document with some metadata in it.\u00a0 Couchbase separates data from metadata for some good reasons, so then we\u2019d need to strip out this \u201c_id\u201d field. Fortunately it\u2019s fairly easy to write an extension method to do this with the .NET SDK or if you are using POCOs (Plan Ole\u2019 Csharp Objects), use a custom ContractResolver.<\/p>\n<h2>The Scenario<\/h2>\n<p>Assume you have a document that looks something like this, perhaps stored on disk:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/b06e7a2b3d36abc564aa.js\"><\/script><\/p>\n<p>What you want to do to is painlessly remove the id from the document itself and make it the key for the document that you will insert into Couchbase. Once this is done there will be two documents stored in Couchbase: the document itself and the document metadata.<\/p>\n<h2>Document metadata? Content? What\u2019s the difference?<\/h2>\n<p><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/developer\/dev-guide-3.0\/keys-values.html\" target=\"_blank\" rel=\"noopener noreferrer\">Metadata<\/a> is data about the document itself, but not about the content of the document. It contains the following values:<\/p>\n<ul>\n<li><strong>TTL<\/strong> \u2013 expiration time of the document<\/li>\n<li><strong>CAS<\/strong> \u2013 compare and swap value for ensuring optimistic concurrency on a key<\/li>\n<li><strong>Flags<\/strong> \u2013 SDK specific metadata for transcoding<\/li>\n<li><strong>Sequence number<\/strong> \u2013 a value used internally within Couchbase for conflict resolution for keys that are updated on different clusters \u2013 thing cross data center replication (XDCR)<\/li>\n<li><strong>Key<\/strong> \u2013 the unique identifier for the document itself<\/li>\n<\/ul>\n<p>All of this information is useful outside of the content itself, so important that it\u2019s separated and it persists in memory. The metadata size various between Couchbase versions; as of 2.1.0 it is 54k, which is fairly small. Now the content of the document, is the actual JSON or binary data itself.<\/p>\n<h2>Using Custom Contract Resolvers w\/Extension Methods<\/h2>\n<p>There are two things we need to do: get the key value for the \u201c_id\u201d from the document and second is ensure that during serialization that the \u201c_id\u201d value is not persisted with the content. The former requires that we parse the JSON string and extract the \u201c_Id\u201d and then assign it to the new document that we will insert into Couchbase. The latter can be done one of two ways: by using a custom ContractResolver or by manipulating the JSON as a JObject itself. It turns out, to support both POCO\u2019s and the dynamic keyword, you need to do both.<\/p>\n<h3>The IgnoreFieldContractResolver<\/h3>\n<p>The Couchbase .NET SDK by default uses the <a href=\"https:\/\/www.newtonsoft.com\/json\" target=\"_blank\" rel=\"noopener noreferrer\">NewtonSoft JSON Framework<\/a> for .NET. When you are configuring your client, there is a hook for assigning a custom contract resolver. A contract resolves from the fields from your JSON to your object model. A custom resolver allows you to do things like ignore or modify fields within your JSON\u2026it works sort of like a filter.<\/p>\n<p>Here is the listing for a custom resolver which ignores whatever fieldname you pass into the constructor:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/a547c942c99293cd4ac7.js\"><\/script><\/p>\n<p>There is not a whole lot going on here, basically we are deriving from DefaultContractResolver and overriding the CreateProperties method. In this case we are omitting the JsonProperty that is the name of the FieldToIgnore field from being serialized. If you now set the ClientConfiguration to use it, like this:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/b86867405773350828d2.js\"><\/script><\/p>\n<p>Then all JSON documents that are serialized will have their FieldToIgnore stripped; in our case we used the \u201c_id\u201d field, since we do not want it persisted (since it will become the metdata key).<\/p>\n<h3>Extracting the Id and Inserting the JSON w\/an Extension Method<\/h3>\n<p>Now that we have a contract resolver which will strip the \u201c_id\u201d field from any JSON we insert using the client, we can extract the id for the document (the value of \u201c_id\u201d) and use it as the key for the insert.<\/p>\n<p>Note that there are two (main) cases for storing JSON (from an SDK perspective) in Couchbase. You can store a POCO which represents the JSON document or you can insert the JSON document as a dynamic Type. Each requires special consideration, but it\u2019s pretty easy to write and extension method which abstracts this:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/77ea2eac7b9d2c07fb51.js\"><\/script><\/p>\n<p>The \u201cspecial\u201d consideration here for dynamic types is that you cannot rely on reflection over T, since T will be an object. You need to create a JObject first and then use that to get the value of \u201c_id\u201d.<\/p>\n<p>Once you have this extension method I place, you can write simple code like this to pull a JSON file from disk, extract the key and insert it into Couchbase:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/ca325b17868bb7c35a96.js\"><\/script><\/p>\n<p>Notice that the for the POCO you target the &#8220;Id&#8221; field and for the dynamic you target the &#8220;_id&#8221;, that is simply because for the dynamic we pull the value directly from the JObject, thus it will reflect the casing and conventions of the original JSON.<\/p>\n<p>Now if you look at the JSON document in Couchbase Managment Console, you&apos;ll see that the &#8220;_id&#8221; field was stripped from the document and used for the key:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/february-2015\/resolving-keys-embedded-within-json\/json-with-id-stripped.jpeg\" width=\"600px\" \/><\/p>\n<h2>Getting the Source:<\/h2>\n<p>If you want to play around with the source I used for this post, it&apos;s in <a href=\"https:\/\/github.com\/couchbaselabs\" target=\"_blank\" rel=\"noopener noreferrer\">couchbase labs<\/a> on Github. The intention of the project (<a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-net-contrib\" target=\"_blank\" rel=\"noopener noreferrer\">couchbase-net-contrib<\/a>) is to provide extensions and plugins that are commonly used when working with the Couchbase SDK, but probably won&apos;t make it into the actual SDK. It&apos;s intended to be community driven, so feel free send a pull requests with any contributions you feel would be useful for others!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A question came up today from a developer looking to migrate to Couchbase from something else.\u00a0 That \u201csomething else\u201d had a JSON document with some metadata in it.\u00a0 Couchbase separates data from metadata for some good reasons, so then we\u2019d [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811],"tags":[1428,1430],"ppma_author":[8970],"class_list":["post-1893","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","tag-couchbase-labs","tag-serialization"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Resolving Keys Embedded within JSON - 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\/resolving-keys-embedded-within-json\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Resolving Keys Embedded within JSON\" \/>\n<meta property=\"og:description\" content=\"A question came up today from a developer looking to migrate to Couchbase from something else.\u00a0 That \u201csomething else\u201d had a JSON document with some metadata in it.\u00a0 Couchbase separates data from metadata for some good reasons, so then we\u2019d [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-03T00:24:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:33+00:00\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software 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\/resolving-keys-embedded-within-json\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Resolving Keys Embedded within JSON\",\"datePublished\":\"2017-01-03T00:24:16+00:00\",\"dateModified\":\"2025-06-14T06:43:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\"},\"wordCount\":896,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"couchbase labs\",\"serialization\"],\"articleSection\":[\".NET\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\",\"name\":\"Resolving Keys Embedded within JSON - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-03T00:24:16+00:00\",\"dateModified\":\"2025-06-14T06:43:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#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\/resolving-keys-embedded-within-json\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Resolving Keys Embedded within JSON\"}]},{\"@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\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Resolving Keys Embedded within JSON - 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\/resolving-keys-embedded-within-json\/","og_locale":"en_US","og_type":"article","og_title":"Resolving Keys Embedded within JSON","og_description":"A question came up today from a developer looking to migrate to Couchbase from something else.\u00a0 That \u201csomething else\u201d had a JSON document with some metadata in it.\u00a0 Couchbase separates data from metadata for some good reasons, so then we\u2019d [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-01-03T00:24:16+00:00","article_modified_time":"2025-06-14T06:43:33+00:00","author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Resolving Keys Embedded within JSON","datePublished":"2017-01-03T00:24:16+00:00","dateModified":"2025-06-14T06:43:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/"},"wordCount":896,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["couchbase labs","serialization"],"articleSection":[".NET"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/","url":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/","name":"Resolving Keys Embedded within JSON - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-03T00:24:16+00:00","dateModified":"2025-06-14T06:43:33+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/resolving-keys-embedded-within-json\/#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\/resolving-keys-embedded-within-json\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Resolving Keys Embedded within JSON"}]},{"@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\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, Senior Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","author_category":"","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","first_name":"Jeff","job_title":"","user_url":"","description":"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1893","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\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1893"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1893\/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=1893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1893"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}