{"id":2177,"date":"2016-05-06T06:58:00","date_gmt":"2016-05-06T06:58:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2177"},"modified":"2025-06-13T21:20:34","modified_gmt":"2025-06-14T04:20:34","slug":"preview-of-the-subdocument-api-using-go","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/preview-of-the-subdocument-api-using-go\/","title":{"rendered":"A API de subdocumento do Couchbase para Go"},"content":{"rendered":"<h2>A API de subdocumento - go<\/h2>\n<p>Voc\u00ea provavelmente j\u00e1 ouviu falar sobre o subdocumento (<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/subdoc-explained\/\"><em>subdoc<\/em><\/a>) API dispon\u00edvel no couchbase 4.5. Mark Nunberg, um dos arquitetos da nova API, tem um \u00f3timo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/subdoc-explained\/\">blog<\/a> sobre a motiva\u00e7\u00e3o e o \u00edmpeto por tr\u00e1s da extens\u00e3o da API do Memcached (valor-chave) para oferecer suporte a opera\u00e7\u00f5es de subdocumento. Matthew Revell tamb\u00e9m elaborou um \u00f3timo <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/sub-documents-change-only-what-you-need-to\/\">amostra<\/a> usando Java e Python. Se voc\u00ea for como eu, vai querer ver qualquer novo recurso expresso em sua(s) linguagem(ns) preferida(s). Para mim, isso significa go ou nodejs. Vamos dar uma olhada em um exemplo e ver como a API funciona em go.<\/p>\n<p style=\"margin-bottom: 1em;color: #4a4947;font-family: 'Kievit OT', sans-serif;text-align: start\"><span style=\"font-weight: bold\">Editar<\/span>: Esta postagem do blog foi editada com atualiza\u00e7\u00f5es da vers\u00e3o 4.5 Beta<\/p>\n<p style=\"margin-bottom: 1em;color: #4a4947;font-family: 'Kievit OT', sans-serif;text-align: start\">Para conhecer outros recursos do Couchbase 4.5, consulte as postagens do blog de Don Pinto sobre o\u00a0<a style=\"background-image: none;color: #ec1e2c;text-decoration: none;background-position: initial initial\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-server-4.5-developer-preview\/\">Visualiza\u00e7\u00e3o do desenvolvedor<\/a>\u00a0e o\u00a0<a style=\"background-image: none;color: #ec1e2c;text-decoration: none;background-position: initial initial\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-4-5-beta\/\">Beta<\/a>.<\/p>\n<p>Vamos come\u00e7ar com uma estrutura json simples, com tr\u00eas campos<\/p>\n<p>Crie um documento usando a estrutura que definimos e \"insira-o\" no couchbase<\/p>\n<p>Agora, vamos adicionar uma matriz ao documento que criamos em um novo campo e, em seguida, executar algumas opera\u00e7\u00f5es adicionais na matriz. Com a m\u00e1gica da API de subdoc, podemos fazer tudo isso sem precisar recuperar ou atualizar o documento inteiro. Isso economiza tempo e largura de banda, al\u00e9m de melhorar consideravelmente o desempenho.<\/p>\n<h2>O que acabou de acontecer? Preciso de um construtor!<\/h2>\n<p>A API go para opera\u00e7\u00f5es de subdocumento adiciona dois novos m\u00e9todos ao tipo Bucket: <code>LookupIn()<\/code> e <code>MutateIn()<\/code>. Essas opera\u00e7\u00f5es em n\u00edvel de bucket s\u00e3o consistentes em todos os SDKs do couchbase. Se voc\u00ea estiver usando go, nodejs, Java, .NET, C ou Python, todas elas funcionam da mesma maneira. Essa \u00e9 uma boa conveni\u00eancia para a portabilidade do c\u00f3digo, pois raramente vemos um ambiente de produ\u00e7\u00e3o com apenas uma linguagem em toda a pilha. Vamos dar uma olhada no que esses dois novos m\u00e9todos do tipo Bucket fazem nos bastidores:<\/p>\n<h3>Muta\u00e7\u00e3o<\/h3>\n<p>Vejamos o MutateInBuilder, usado para combinar uma ou mais opera\u00e7\u00f5es de muta\u00e7\u00e3o com escopo em um \u00fanico documento: <code>func (b *Bucket) MutateIn(key string, cas Cas, expiry uint32) *MutateInBuilder<\/code>. Essa fun\u00e7\u00e3o inclui um m\u00e9todo receptor para o tipo Bucket e retorna uma refer\u00eancia ao MutateInBuilder<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/preview-of-the-subdocument-api-using-go\/subdoc_go_water.jpg\" \/><\/p>\n<p><strong>O MutateInBuilder tem dez m\u00e9todos:<\/strong><\/p>\n<ul>\n<li><strong>AddUnique(): <\/strong><code>func (set *MutateInBuilder) AddUnique(path string, value interface{}, createParents bool) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo adiciona um valor exclusivo a um campo de matriz existente. Ele verifica se o valor existe primeiro e o atualiza. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>ArrayInsert(): <\/strong><code>func (set *MutateInBuilder) ArrayInsert(path string, value interface{}) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo insere um valor de matriz em um campo de matriz de um documento. <strong>Observa\u00e7\u00e3o<\/strong>Em nosso exemplo acima, passamos uma string que representa a matriz e o \u00edndice: \"fourthItem[2]\". Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>Counter(): <\/strong><code>func (set *MutateInBuilder) Counter(path string, delta int64, createParents bool) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo executa uma opera\u00e7\u00e3o de contador at\u00f4mico em um campo de um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong style=\"line-height: 1.6em\">Insert(): <\/strong><code style=\"font-size: 13px;line-height: 1.6em\">func (set *MutateInBuilder) Insert(path string, value interface{}, createParents bool) *MutateInBuilder \u00a0<\/code><span style=\"line-height: 1.6em\">Esse m\u00e9todo insere um novo valor em um local espec\u00edfico de um documento. Ele retorna uma refer\u00eancia a um <\/span><code style=\"font-size: 13px;line-height: 1.6em\">MutateInBuilder<\/code><\/li>\n<li><strong>PushBack(): <\/strong><code>func (set *MutateInBuilder) PushBack(path string, value interface{}, createParents bool) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo adiciona um novo valor ao final de um campo de matriz em um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>PushFront(): <\/strong><code>func (set *MutateInBuilder) PushFront(path string, value interface{}, createParents bool) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo adiciona um novo valor ao in\u00edcio de um campo de matriz em um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>Remove(): <\/strong><code>func (set *MutateInBuilder) Remove(path string) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo remove um valor de um campo espec\u00edfico de um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>Replace(): <\/strong><code>func (set *MutateInBuilder) Replace(path string, value interface{}) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo substitui um valor em um campo de um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>Upsert(): <\/strong><code>func (set *MutateInBuilder) Upsert(path string, value interface{}, createParents bool) *MutateInBuilder \u00a0<\/code>Esse m\u00e9todo adiciona ou substitui um campo em um documento. Ele retorna uma refer\u00eancia a um <code>MutateInBuilder<\/code><\/li>\n<li><strong>Execute():\u00a0<\/strong><code>func (set *MutateInBuilder) Execute() (*DocumentFragment, error) \u00a0<\/code>Esse m\u00e9todo envia as opera\u00e7\u00f5es encadeadas ao servidor e retorna um\u00a0<code>Fragmento de documento\u00a0<\/code><span style=\"color: #333333;line-height: 20.8px;text-align: left\">contendo seus resultados.<\/span><\/li>\n<\/ul>\n<p><strong>O fluxo l\u00f3gico para <code>MutateIn()<\/code> tem o seguinte aspecto<\/strong><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/preview-of-the-subdocument-api-using-go\/subdoc_go_mutatein.jpg\" \/><\/p>\n<h3>Pesquisa<\/h3>\n<p>Vamos dar uma olhada no LookupInBuilder, que nos permite declarar uma ou mais opera\u00e7\u00f5es de recupera\u00e7\u00e3o com escopo de um \u00fanico documento: <code>func (b *Bucket) LookupIn(key string) *LookupInBuilder<\/code>. Essa fun\u00e7\u00e3o inclui um m\u00e9todo receptor para o tipo Bucket e retorna uma refer\u00eancia ao LookupInBuilder.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/preview-of-the-subdocument-api-using-go\/subdoc_go_spyglass.jpg\" \/><\/p>\n<p><strong>O LookupInBuilder tem tr\u00eas m\u00e9todos:<\/strong><\/p>\n<ul>\n<li><strong style=\"line-height: 1.6em\">Get(): <\/strong><code style=\"font-size: 13px;line-height: 1.6em\">func (set *LookupInBuilder) Get(path string) *LookupInBuilder \u00a0<\/code><span style=\"line-height: 1.6em\">Esse m\u00e9todo solicita que o conte\u00fado do caminho seja recuperado. Retorna uma refer\u00eancia a um <\/span><code style=\"font-size: 13px;line-height: 1.6em\">LookupInBuilder<\/code><\/li>\n<li><strong>Exists():\u00a0<\/strong><code>func (set *LookupInBuilder) Exists(path string) *LookupInBuilder \u00a0<\/code>\u00a0Verifica se o caminho fornecido existe. Retorna uma refer\u00eancia a um\u00a0<code>LookupInBuilder<\/code><\/li>\n<li><strong>Execute(): <\/strong><code>func (set *LookupInBuilder) Execute() (*DocumentFragment, error)<\/code>\u00a0 Esse m\u00e9todo envia os comandos encadeados ao servidor e retorna uma refer\u00eancia a um <code>Fragmento de documento<\/code> (contendo os resultados) e um tipo <code>erro<\/code> se for encontrado um.<\/li>\n<\/ul>\n<p><strong>O fluxo l\u00f3gico para <code>LookupIn()<\/code>tem o seguinte aspecto<\/strong><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/preview-of-the-subdocument-api-using-go\/subdoc_go_lookupin.jpg\" \/><\/p>\n<h2>Pr\u00f3ximas etapas<\/h2>\n<p>Por que n\u00e3o tentar voc\u00ea mesmo? O exemplo acima, juntamente com v\u00e1rios outros exemplos de go, pode ser encontrado em nosso reposit\u00f3rio de guias do desenvolvedor em <a href=\"https:\/\/github.com\/couchbaselabs\/devguide-examples\/tree\/master\/go\">github<\/a> Uma \u00f3tima maneira de come\u00e7ar e experimentar o couchbase 4.5 (em vers\u00e3o beta no momento da publica\u00e7\u00e3o) \u00e9 com o docker. A imagem do docker do couchbase 4.5 pode ser carregada se voc\u00ea tiver o docker instalado com o seguinte comando:<\/p>\n<p><code>docker run -d --name=CB45DP1 -p 8091-8093:8091-8094 -p 11207-11210:11207-11210 -p 18091-18092:18091-18092 couchbase\/server:enterprise-4.5.0-Beta<\/code><\/p>\n<p>N\u00f3s gostamos de receber feedback - experimente e diga-nos o que voc\u00ea achou.<\/p>","protected":false},"excerpt":{"rendered":"<p>The Sub-Document API &#8211; go You&#8217;ve probably heard about the sub-document (subdoc)\u00a0API available in couchbase 4.5. Mark Nunberg, one of the architects of the new API, has a great blog on the motivation and impetus behind extending the Memcached (key-value) [&hellip;]<\/p>","protected":false},"author":20,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1820],"tags":[],"ppma_author":[9019],"class_list":["post-2177","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-golang"],"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>The Couchbase Sub-Document API for Go - 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\/pt\/preview-of-the-subdocument-api-using-go\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Couchbase Sub-Document API for Go\" \/>\n<meta property=\"og:description\" content=\"The Sub-Document API &#8211; go You&#8217;ve probably heard about the sub-document (subdoc)\u00a0API available in couchbase 4.5. Mark Nunberg, one of the architects of the new API, has a great blog on the motivation and impetus behind extending the Memcached (key-value) [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/preview-of-the-subdocument-api-using-go\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-06T06:58:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:20:34+00:00\" \/>\n<meta name=\"author\" content=\"Todd Greenstein\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@todd_greenstein\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Todd Greenstein\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/\"},\"author\":{\"name\":\"Todd Greenstein\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/64b5d1e5969768c5d63c11c696951ed3\"},\"headline\":\"The Couchbase Sub-Document API for Go\",\"datePublished\":\"2016-05-06T06:58:00+00:00\",\"dateModified\":\"2025-06-14T04:20:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/\"},\"wordCount\":755,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"GoLang\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/\",\"name\":\"The Couchbase Sub-Document API for Go - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-06T06:58:00+00:00\",\"dateModified\":\"2025-06-14T04:20:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#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\/preview-of-the-subdocument-api-using-go\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Couchbase Sub-Document API for Go\"}]},{\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/64b5d1e5969768c5d63c11c696951ed3\",\"name\":\"Todd Greenstein\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abfbe093983052aa28595343c19888ce\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g\",\"caption\":\"Todd Greenstein\"},\"description\":\"Todd Greenstein is a Solution Architect at Couchbase. Todd is specialize in API design, architecture, data modeling, nodejs and golang development.\",\"sameAs\":[\"https:\/\/x.com\/todd_greenstein\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/todd-greenstein\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Couchbase Sub-Document API for Go - 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\/pt\/preview-of-the-subdocument-api-using-go\/","og_locale":"pt_BR","og_type":"article","og_title":"The Couchbase Sub-Document API for Go","og_description":"The Sub-Document API &#8211; go You&#8217;ve probably heard about the sub-document (subdoc)\u00a0API available in couchbase 4.5. Mark Nunberg, one of the architects of the new API, has a great blog on the motivation and impetus behind extending the Memcached (key-value) [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/preview-of-the-subdocument-api-using-go\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-06T06:58:00+00:00","article_modified_time":"2025-06-14T04:20:34+00:00","author":"Todd Greenstein","twitter_card":"summary_large_image","twitter_creator":"@todd_greenstein","twitter_misc":{"Written by":"Todd Greenstein","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/"},"author":{"name":"Todd Greenstein","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/64b5d1e5969768c5d63c11c696951ed3"},"headline":"The Couchbase Sub-Document API for Go","datePublished":"2016-05-06T06:58:00+00:00","dateModified":"2025-06-14T04:20:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/"},"wordCount":755,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["GoLang"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/","url":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/","name":"The Couchbase Sub-Document API for Go - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-06T06:58:00+00:00","dateModified":"2025-06-14T04:20:34+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/preview-of-the-subdocument-api-using-go\/#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\/preview-of-the-subdocument-api-using-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"The Couchbase Sub-Document API for Go"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/64b5d1e5969768c5d63c11c696951ed3","name":"Todd Greenstein","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/abfbe093983052aa28595343c19888ce","url":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","caption":"Todd Greenstein"},"description":"Todd Greenstein is a Solution Architect at Couchbase. Todd is specialize in API design, architecture, data modeling, nodejs and golang development.","sameAs":["https:\/\/x.com\/todd_greenstein"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/todd-greenstein\/"}]}},"authors":[{"term_id":9019,"user_id":20,"is_guest":0,"slug":"todd-greenstein","display_name":"Todd Greenstein","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f230045f7f6e636cf01abbd35f1cbf66a1206fbe149a0d4f0bbdd992c646257d?s=96&d=mm&r=g","author_category":"","last_name":"Greenstein","first_name":"Todd","job_title":"","user_url":"","description":"Todd Greenstein \u00e9 arquiteto de solu\u00e7\u00f5es na Couchbase. Todd \u00e9 especializado em design de API, arquitetura, modelagem de dados, desenvolvimento em nodejs e golang."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2177"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2177\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2177"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}