{"id":2150,"date":"2016-05-04T13:55:52","date_gmt":"2016-05-04T13:55:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2150"},"modified":"2024-11-26T23:22:28","modified_gmt":"2024-11-27T07:22:28","slug":"subdocument-couchbase-java-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/subdocument-couchbase-java-sdk\/","title":{"rendered":"Como ficar mais enxuto com o SubDocument e o Java SDK"},"content":{"rendered":"<p>Nesta postagem do blog, apresentaremos um novo recurso interessante do pr\u00f3ximo <strong>Vers\u00e3o do Couchbase Server <code>4.5<\/code><\/strong> (codinome <em>Watson<\/em>), agora em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">Beta<\/a>.<\/p>\n<p>Estamos falando sobre o <strong>API de subdocumento<\/strong> (abreviado para <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/subdoc-explained\/\">subdoc<\/a>).<\/p>\n<ul class=\"toc\">\n<li><a href=\"#toc_0\">Do que se trata?<\/a><\/li>\n<li><a href=\"#toc_1\">A API do cliente<\/a>\n<ul>\n<li><a href=\"#toc_2\">Opera\u00e7\u00f5es de pesquisa<\/a><\/li>\n<li><a href=\"#toc_3\">Opera\u00e7\u00f5es de muta\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"#toc_4\">Tratamento de erros<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#toc_5\">Conclus\u00e3o<\/a><\/li>\n<\/ul>\n<p><strong>Editar<\/strong>: Esta postagem do blog foi editada com atualiza\u00e7\u00f5es do 4.5 Beta e do Java SDK\u00a0<strong>2.2.6<\/strong>.<\/p>\n<p>Para conhecer outros recursos do Couchbase 4.5, consulte as postagens do blog de Don Pinto sobre o\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-server-4.5-developer-preview\/\">Visualiza\u00e7\u00e3o do desenvolvedor<\/a>\u00a0e o\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-4-5-beta\/\">Beta<\/a>.<\/p>\n<h2 id=\"toc_0\">Do que se trata?<\/h2>\n<p>O subdocumento \u00e9 um recurso do lado do servidor que adiciona ao <code>Memcached<\/code> protocolo que alimenta o Couchbase <strong>Opera\u00e7\u00f5es de chave-valor<\/strong>. Ele adiciona algumas opera\u00e7\u00f5es que atuam em um \u00fanico <strong>JSON<\/strong> mas, em vez de for\u00e7\u00e1-lo a recuperar o conte\u00fado completo do documento, ele permite que voc\u00ea especifique o <code>caminho<\/code> dentro do JSON que voc\u00ea est\u00e1 interessado em recuperar ou alterar.<\/p>\n<p>Vou lhe mostrar por que isso \u00e9 interessante com o seguinte cen\u00e1rio: digamos que voc\u00ea tenha um documento JSON grande (e eu quero dizer laaaaarge) armazenado sob o ID <code>K<\/code> no Couchbase. Dentro do documento, no dicion\u00e1rio <code>submarino<\/code> h\u00e1 um <code>alguns<\/code> que voc\u00ea deseja atualizar. Como voc\u00ea faria isso com o Couchbase 4.1?<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/subdocument-couchbase-java-sdk\/withoutsubdoc_1.png\" \/><\/p>\n<p>\u00c9 isso mesmo, voc\u00ea precisa executar um <code>get(k)<\/code> de todo o documento, modificar seu conte\u00fado localmente e, em seguida, executar um <code>upsert<\/code> (ou um <code>substituir<\/code>). Voc\u00ea n\u00e3o apenas transmite todo o documento grande pela rede quando est\u00e1 interessado apenas em uma pequena parte dele, mas tamb\u00e9m <strong>transmiti-lo duas vezes<\/strong>!<\/p>\n<p>O <strong>subdoc<\/strong> A API permite opera\u00e7\u00f5es mais simples nesses casos. Escolha a opera\u00e7\u00e3o que deseja executar em seu documento e forne\u00e7a a chave, o caminho dentro do JSON e, opcionalmente, o valor que deseja usar para essa opera\u00e7\u00e3o, e <em>voil\u00e0<\/em>!<\/p>\n<p>Em nosso exemplo anterior, o <code>caminho<\/code> seria \"<code>sub.value<\/code>\". Isso \u00e9 bastante natural e consistente com a sintaxe de caminho usada em nossa linguagem de consulta, <code>N1QL<\/code>. Aqui est\u00e1 a apar\u00eancia, n\u00e3o desenhada em escala :)<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/subdocument-couchbase-java-sdk\/withsubdoc_1.png\" \/><\/p>\n<p>Na verdade, a mensagem tem apenas alguns bytes, portanto, quanto maior for o documento JSON original, maior ser\u00e1 o benef\u00edcio.<\/p>\n<h2 id=\"toc_1\">A API do cliente<\/h2>\n<p>Agora, aposto que tenho sua aten\u00e7\u00e3o. Mas quais s\u00e3o as opera\u00e7\u00f5es oferecidas e como \u00e9 a API?<\/p>\n<p>Vamos usar o exemplo da API Java, conforme oferecido pelo <code>2.2.6<\/code>\u00a0Java SDK.<\/p>\n<p>Para cada exemplo, consideraremos que um \"<code>subdoc<\/code>\" O documento JSON existe no banco de dados e tem o seguinte conte\u00fado:<\/p>\n<div>\n<pre><code class=\"language-javascript\">{\r\n  \"fruits\": [ \"apple\", \"banana\", \"ananas\" ],\r\n  \"sub\": {\r\n    \"value\": \"someString\",\r\n    \"bool\": false\r\n  },\r\n  \"counter\": 1,\r\n  \"junk\": [ ... ] \/\/a very very long array\r\n}<\/code><\/pre>\n<\/div>\n<p>Tamb\u00e9m consideramos que a <code>Balde<\/code> inst\u00e2ncia, <code>balde<\/code>est\u00e1 dispon\u00edvel.<\/p>\n<h2 id=\"toc_2\">Opera\u00e7\u00f5es de pesquisa<\/h2>\n<p>Sem falar em muta\u00e7\u00f5es dentro de um JSON, \u00e0s vezes voc\u00ea s\u00f3 quer ler um \u00fanico valor escondido no fundo do documento. Ou apenas deseja verificar se uma entrada est\u00e1 l\u00e1. O Subdoc oferece duas opera\u00e7\u00f5es (<code>obter<\/code> e <code>existe<\/code>) para fazer exatamente isso, que s\u00e3o disponibilizados por meio do <code>bucket.lookupIn(String key)<\/code> m\u00e9todo.<\/p>\n<p>O <code>lookupIn<\/code> na verdade, fornece a voc\u00ea um construtor direcionado a um \u00fanico documento JSON (\"<code>chave<\/code>\"), que, por sua vez, voc\u00ea pode usar para descrever com flu\u00eancia as opera\u00e7\u00f5es que deseja executar. Depois de ter todo o conjunto de especifica\u00e7\u00f5es de pesquisa pronto, voc\u00ea pode executar a opera\u00e7\u00e3o chamando a fun\u00e7\u00e3o <code>executar()<\/code> m\u00e9todo. \u00c9 claro que ele tamb\u00e9m pode ser usado para uma \u00fanica pesquisa.<\/p>\n<p>Esse m\u00e9todo retorna um <code>Fragmento de documento<\/code> em Java, representando o resultado. Observe que as pesquisas m\u00faltiplas sempre retornam esse resultado, desde que n\u00e3o ocorra nenhum erro no n\u00edvel do documento (ou seja, o documento n\u00e3o existe ou n\u00e3o \u00e9 JSON).<\/p>\n<p>Voc\u00ea pode obter o resultado individual de cada opera\u00e7\u00e3o chamando <code>result.content(String path)<\/code> ou <code>result.content(int operationIndex)<\/code> (se voc\u00ea tiver v\u00e1rias opera\u00e7\u00f5es direcionadas ao mesmo caminho, nesse caso, a primeira sempre retornar\u00e1 o resultado da primeira). Se houver um erro, voc\u00ea obter\u00e1 a classe filha apropriada de <code>SubDocumentException<\/code>. Caso contr\u00e1rio, voc\u00ea obt\u00e9m o valor (ou \"true\" no caso de <code>existe<\/code>).<\/p>\n<p>H\u00e1 tamb\u00e9m um <code>existe<\/code> semelhante ao content, mas que retorna true somente se o objeto result contiver um resultado para esse caminho\/\u00edndice e a opera\u00e7\u00e3o correspondente tiver sido bem-sucedida.<\/p>\n<div>\n<pre><code class=\"language-java\">DocumentFragment result = bucket\r\n    .lookupIn(\"subdoc\")\r\n    .get(\"sub.value\")\r\n    .exists(\"fruits\")\r\n    .exists(\"sub.foo\")\r\n    .execute();\r\n\r\nString subValue = result.content(\"sub.value\", String.class);\r\nboolean fruitsExist = result.content(\"fruits\", Boolean.class);\r\nboolean fooExist = bucket.exists(\"sub.foo\");\r\n\r\nSystem.out.println(subValue + \", \" +\r\n  fruitsExist + \", \" +\r\n  foExist);<\/code><\/pre>\n<\/div>\n<p>O c\u00f3digo acima imprime:<\/p>\n<div>\n<pre><code class=\"language-none\">someString, true, false<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_3\">Opera\u00e7\u00f5es de muta\u00e7\u00e3o<\/h2>\n<p>H\u00e1 mais variedades de opera\u00e7\u00f5es de muta\u00e7\u00e3o. Algumas s\u00e3o feitas sob medida para lidar com matrizes, enquanto outras s\u00e3o mais adaptadas para lidar com dicion\u00e1rios.<\/p>\n<p>Mais uma vez, fornecemos um construtor para direcionar muta\u00e7\u00f5es em um documento JSON espec\u00edfico por meio de <code>bucket.mutateIn(String key)<\/code>. Voc\u00ea encadeia as opera\u00e7\u00f5es que deseja executar e, por fim, chama <code>executar()<\/code> para realizar o conjunto de muta\u00e7\u00f5es.<\/p>\n<p>As muta\u00e7\u00f5es podem levar em conta o CAS do documento anexo, verificando o CAS fornecido em rela\u00e7\u00e3o ao atual antes de aplicar todo o conjunto de muta\u00e7\u00f5es. Para fazer isso, forne\u00e7a o CAS a ser verificado, chamando <code>.withCas(long cas)<\/code> uma vez em sua cadeia de construtores.<\/p>\n<p>Outros <code>com<\/code> Os m\u00e9todos (que s\u00f3 precisam ser chamados uma vez) s\u00e3o:<\/p>\n<ul>\n<li><code>withDurability(PersistTo p, ReplicateTo r)<\/code>permite observar uma restri\u00e7\u00e3o de durabilidade em todo o conjunto de muta\u00e7\u00f5es.<\/li>\n<li><code>withExpiry(int ttl)<\/code>Permite dar ao documento um prazo de validade quando a muta\u00e7\u00e3o for bem-sucedida.<\/li>\n<\/ul>\n<p>Al\u00e9m disso, algumas muta\u00e7\u00f5es permitem criar objetos mais profundos (por exemplo, criar a entrada no caminho <code>newDict.sub.entry<\/code>, apesar de <code>newDict<\/code> e <code>submarino<\/code> n\u00e3o existente). Isso \u00e9 representado pelo s\u00edmbolo <code>createParents<\/code> nos m\u00e9todos do construtor.<\/p>\n<p>Tomando o exemplo acima e usando algumas das opera\u00e7\u00f5es de muta\u00e7\u00e3o, podemos fazer o seguinte com efici\u00eancia:<\/p>\n<ol>\n<li>Substituir a fruta <code>ananas<\/code> (que \u00e9 incorretamente uma palavra francesa) com <code>abacaxi<\/code>.<\/li>\n<li>Adicionar uma nova fruta, <code>pera<\/code> no <em>frente<\/em> da matriz de frutas.<\/li>\n<li>Adicionar uma nova entrada a <code>submarino<\/code> chamado <code>novoValor<\/code>.<\/li>\n<li>Incrementar a <code>contador<\/code> por um delta de <code>100<\/code>.<\/li>\n<li>Livre-se do <code>lixo<\/code> grande matriz.<\/li>\n<li>Aguarde at\u00e9 que o cbserver confirme que os dados foram gravados no disco do mestre.<\/li>\n<li>Abortar tudo se o CAS no servidor n\u00e3o for <code>1234<\/code>.<\/li>\n<\/ol>\n<p>Veja como fazer isso usando o Java SDK:<\/p>\n<div>\n<pre><code class=\"language-java\">boolean createParents = false;\r\n\r\nDocumentFragment result = bucket\r\n    .mutateIn(\"subdoc\")\r\n    .replace(\"fruits[2]\", \"pineapple\")\r\n    .arrayPrepend(\"fruits\", \"pear\", createParents)\r\n    .insert(\"sub.newValue\", \"theNewValue\", createParents)\r\n    .counter(\"counter\", 100L, createParents)\r\n    .remove(\"junk\")\r\n    .withDurability(PersistTo.MASTER, ReplicateTo.NONE)\r\n    .withCas(1234L)\r\n    .execute();<\/code><\/pre>\n<\/div>\n<p>Outras opera\u00e7\u00f5es de muta\u00e7\u00e3o dispon\u00edveis s\u00e3o:<\/p>\n<ul>\n<li><code>upsert<\/code><\/li>\n<li><code>arrayInsert<\/code> (especializado na inser\u00e7\u00e3o de um valor em uma matriz, em um \u00edndice espec\u00edfico)<\/li>\n<li><code>arrayAppend<\/code>\u00a0(especializado na inser\u00e7\u00e3o de um valor no final de uma matriz)<\/li>\n<li><span style=\"color: #333333;font-family: monospace, monospace;line-height: 20.8px;text-align: left\">arrayInsertAll<\/span><span style=\"color: #333333;line-height: 20.8px;text-align: left\">\u00a0(o mesmo que arrayInsert, mas inserindo cada elemento de uma cole\u00e7\u00e3o na matriz)<\/span><\/li>\n<li><span style=\"color: #333333;font-family: monospace, monospace;line-height: 20.8px;text-align: left\">arrayPrependAll<\/span><span style=\"color: #333333;line-height: 20.8px;text-align: left\">\u00a0(o mesmo que arrayPrepend, mas adicionando cada elemento de uma cole\u00e7\u00e3o \u00e0 frente de uma matriz)<\/span><\/li>\n<li><span style=\"color: #333333;font-family: monospace, monospace;line-height: 20.8px;text-align: left\">arrayAppendAll<\/span> (o mesmo que arrayAppend, mas adicionando cada elemento de uma cole\u00e7\u00e3o \u00e0 parte de tr\u00e1s de uma matriz)<\/li>\n<li><code>arrayAddUnique<\/code> (especializado em inserir um valor em uma matriz se o valor ainda n\u00e3o estiver presente na matriz)<\/li>\n<\/ul>\n<p>Depois de aplicar essas 5 muta\u00e7\u00f5es, eis a apar\u00eancia do documento no banco de dados:<\/p>\n<div>\n<pre><code class=\"language-javascript\">{\r\n  \"fruits\": [ \"pear\", \"apple\", \"banana\", \"pineapple\" ],\r\n  \"sub\": {\r\n    \"value\": \"someString\",\r\n    \"bool\": false,\r\n    \"newValue\": \"theNewValue\"\r\n  },\r\n  \"counter\": 101\r\n}<\/code><\/pre>\n<\/div>\n<p>Ao contr\u00e1rio do que acontece quando voc\u00ea faz v\u00e1rias pesquisas, se alguma das muta\u00e7\u00f5es falhar, todo o conjunto de opera\u00e7\u00f5es ser\u00e1 ignorado e nenhuma muta\u00e7\u00e3o ser\u00e1 executada. Nesse caso, voc\u00ea receber\u00e1 uma mensagem <code>MultiMutationException<\/code> no qual voc\u00ea pode verificar o \u00edndice da primeira opera\u00e7\u00e3o com falha (bem como o status de erro correspondente).<\/p>\n<h2 id=\"toc_4\">Tratamento de erros<\/h2>\n<p>Cada opera\u00e7\u00e3o de subdocumento pode levar a erros relacionados ao subdocumento: e se o documento que corresponde \u00e0 chave fornecida n\u00e3o for JSON? E se voc\u00ea fornecer um caminho que n\u00e3o existe? Ou se o caminho contiver um \u00edndice de matriz em um elemento que n\u00e3o \u00e9 uma matriz (por exemplo. <code>sub[1]<\/code>)?<\/p>\n<p>Todos os erros espec\u00edficos de subdoc t\u00eam um <code>Status da resposta<\/code> no Java SDK e uma subclasse dedicada de <code>SubDocumentException<\/code>. Essas exce\u00e7\u00f5es s\u00e3o consistentes nos SDKs que oferecem uma API para subdocumentos:<\/p>\n<p>A lista completa no Java SDK \u00e9:<\/p>\n<ul>\n<li>PathNotFoundException<\/li>\n<li>PathExistsException<\/li>\n<li>NumberTooBigException<\/li>\n<li>PathTooDeepException<\/li>\n<li>PathMismatchException<\/li>\n<li>ValueTooDeepException<\/li>\n<li>DeltaTooBigException<\/li>\n<li>CannotInsertValueException<\/li>\n<li>PathInvalidException<\/li>\n<li>DocumentNotJsonException*<\/li>\n<li>DocumentTooDeepException*<\/li>\n<li>MultiMutationException*<\/li>\n<\/ul>\n<p>Os tr\u00eas \u00faltimos s\u00e3o de n\u00edvel de documento (o que significa que se aplicam a todo o documento, sem considerar os caminhos individuais), de modo que sempre ser\u00e3o lan\u00e7ados diretamente pelo <code>executar()<\/code>\u00a0m\u00e9todos.<\/p>\n<p>Os outros tamb\u00e9m podem ser lan\u00e7ados ao chamar <code>Fragmento de documento<\/code>'s <code>conte\u00fado<\/code> nos casos em que voc\u00ea especificou v\u00e1rias opera\u00e7\u00f5es de pesquisa.<\/p>\n<p>Como dito na se\u00e7\u00e3o anterior, v\u00e1rias opera\u00e7\u00f5es de muta\u00e7\u00e3o em que pelo menos uma falha acionam um <code>MultiMutationException<\/code> sendo lan\u00e7ada. Essa exce\u00e7\u00e3o tem um <code>firstFailureIndex()<\/code> e <code>firstFailureStatus()<\/code> para obter informa\u00e7\u00f5es sobre qual especifica\u00e7\u00e3o causou a falha de toda a opera\u00e7\u00e3o.<\/p>\n<h2 id=\"toc_5\">Conclus\u00e3o<\/h2>\n<p>Esperamos que voc\u00ea encontre \u00f3timos casos de uso para esse novo recurso e que o adore! Ent\u00e3o, pegue o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/nosql-databases\/downloads\/\">Couchbase 4.5 Beta<\/a>brinque com a API e n\u00e3o hesite em nos informar <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/c\/java-sdk\/\">feedback<\/a>!<\/p>\n<p>Nesse meio tempo, <strong>Codifica\u00e7\u00e3o feliz<\/strong>! &#8211; <em>A equipe do Java SDK<\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>In this blog post we&#8217;ll introduce an exciting new feature of the upcoming Couchbase Server version 4.5 (codename Watson), now in Beta. We are talking about the Sub-Document API (shortened to subdoc). What Is It About? The Client API Lookup [&hellip;]<\/p>","protected":false},"author":48,"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,1818],"tags":[1466,1587,1586],"ppma_author":[9022],"class_list":["post-2150","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-java","tag-preview","tag-subdoc","tag-subdocument"],"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>Getting Leaner with SubDocument and the Java SDK<\/title>\n<meta name=\"description\" content=\"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.\" \/>\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\/subdocument-couchbase-java-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting Leaner with SubDocument and the Java SDK\" \/>\n<meta property=\"og:description\" content=\"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/subdocument-couchbase-java-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-04T13:55:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-27T07:22:28+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Getting Leaner with SubDocument and the Java SDK\",\"datePublished\":\"2016-05-04T13:55:51+00:00\",\"dateModified\":\"2024-11-27T07:22:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/\"},\"wordCount\":1290,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"preview\",\"subdoc\",\"subdocument\"],\"articleSection\":[\"Couchbase Server\",\"Java\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/\",\"name\":\"Getting Leaner with SubDocument and the Java SDK\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-04T13:55:51+00:00\",\"dateModified\":\"2024-11-27T07:22:28+00:00\",\"description\":\"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#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\/subdocument-couchbase-java-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting Leaner with SubDocument and the Java SDK\"}]},{\"@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\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como ficar mais enxuto com o SubDocument e o Java SDK","description":"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.","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\/subdocument-couchbase-java-sdk\/","og_locale":"pt_BR","og_type":"article","og_title":"Getting Leaner with SubDocument and the Java SDK","og_description":"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/subdocument-couchbase-java-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-04T13:55:51+00:00","article_modified_time":"2024-11-27T07:22:28+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Getting Leaner with SubDocument and the Java SDK","datePublished":"2016-05-04T13:55:51+00:00","dateModified":"2024-11-27T07:22:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/"},"wordCount":1290,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["preview","subdoc","subdocument"],"articleSection":["Couchbase Server","Java"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/","name":"Como ficar mais enxuto com o SubDocument e o Java SDK","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-04T13:55:51+00:00","dateModified":"2024-11-27T07:22:28+00:00","description":"Check the exciting new feature (updates) of upcoming Couchbase Server version 4.5 Beta version and Java SDK 2.2.6. Learn more about SubDocument API.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/subdocument-couchbase-java-sdk\/#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\/subdocument-couchbase-java-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Getting Leaner with SubDocument and the Java SDK"}]},{"@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\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, engenheiro de software, Pivotal","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","first_name":"Simon","last_name":"Basle","user_url":"","author_category":"","description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2150","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\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2150"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2150\/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=2150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2150"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}