{"id":1628,"date":"2013-07-21T10:00:00","date_gmt":"2013-07-21T08:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1628"},"modified":"2023-11-10T10:17:25","modified_gmt":"2023-11-10T18:17:25","slug":"how-implement-document-versioning-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/how-implement-document-versioning-couchbase\/","title":{"rendered":"Como fazer : Implementar o controle de vers\u00e3o de documentos com o Couchbase"},"content":{"rendered":"<p style=\"margin-bottom: 0px;font-family: ff-kievit-web, 'MS UI Gothic', 'MS PGothic', Osaka, Batang, Georgia, 'Times New Roman', Times, sans-serif;font-size: 16px\"><em style=\"line-height: 23px;font-size: 1em;font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif\">[Este blog foi distribu\u00eddo pelo site https:\/\/blog.grallandco.com].<\/em><\/p>\n<h3>Introdu\u00e7\u00e3o<\/h3>\n<div class=\"p2\">Os desenvolvedores sempre me perguntam como \"versionar\" documentos com o Couchbase 2.0. A resposta curta \u00e9: os clientes e o servidor n\u00e3o exp\u00f5em esse recurso, mas ele \u00e9 muito f\u00e1cil de implementar.<\/div>\n<div class=\"p2\"><\/div>\n<div class=\"p3\">Neste artigo, usarei uma abordagem b\u00e1sica, que poder\u00e1 ser ampliada dependendo de seus requisitos comerciais.<\/div>\n<div class=\"p3\"><\/div>\n<h3>Design<\/h3>\n<div class=\"p3\">A primeira coisa a fazer \u00e9 selecionar como \"armazenar\/organizar\" as vers\u00f5es do seu documento, e para isso voc\u00ea tem diferentes designs:<\/div>\n<ul class=\"ul1\">\n<li class=\"li4\">copiar as vers\u00f5es do documento em novos documentos<\/li>\n<li class=\"li4\">copiar as vers\u00f5es do documento em uma lista de documentos incorporados<\/li>\n<li class=\"li4\">armazenar a lista de atributos que foram alterados em um elemento incorporado (ou novos documentos)<\/li>\n<li class=\"li4\">armazenar o \"delta\"<\/li>\n<li class=\"li4\">...<\/li>\n<\/ul>\n<div class=\"p3\">Voc\u00ea ter\u00e1 de escolher o design com base nos requisitos do seu aplicativo (l\u00f3gica comercial, tamanho do conjunto de dados, etc.).  Para este artigo, vamos usar uma das abordagens mais simplistas: criar um novo documento para cada vers\u00e3o com as seguintes regras para as chaves:<\/div>\n<ol class=\"ol1\">\n<li class=\"li4\">A vers\u00e3o atual \u00e9 uma simples chave\/documento, sem altera\u00e7\u00f5es na chave.<\/li>\n<li class=\"li4\">A vers\u00e3o \u00e9 uma c\u00f3pia do documento, e o n\u00famero da vers\u00e3o \u00e9 adicionado \u00e0 chave.<\/li>\n<\/ol>\n<div class=\"p3\">Isso se parece com:<\/div>\n<table class=\"margin:30px\" border=\"0\">\n<tbody>\n<tr>\n<td>Vers\u00e3o atual<\/td>\n<td><span style=\"font-family: Courier New, Courier, monospace\">\u00a0 minha chave<\/span><\/td>\n<\/tr>\n<tr>\n<td>Vers\u00e3o 1<\/td>\n<td><span style=\"font-family: Courier New, Courier, monospace\">\u00a0 mykey::v1<\/span><\/td>\n<\/tr>\n<tr>\n<td>Vers\u00e3o 2<\/td>\n<td><span style=\"font-family: 'Courier New', Courier, monospace\">\u00a0 mykey::v2<\/span><\/td>\n<\/tr>\n<tr>\n<td>&#8230;<\/td>\n<td>\u00a0 \u00a0 \u00a0&#8230;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"p5\"><\/div>\n<div class=\"p5\">\n<p>Com essa abordagem, os aplicativos existentes sempre usar\u00e3o a vers\u00e3o atual do documento, pois a chave n\u00e3o \u00e9 alterada. Mas essa abordagem cria novos documentos que ser\u00e3o indexados pelas exibi\u00e7\u00f5es existentes.<\/p>\n<p>Por exemplo, no aplicativo Beer Sample, a visualiza\u00e7\u00e3o a seguir \u00e9 usada para listar a cerveja por nome:<\/p>\n<\/div>\n<div class=\"p3\"><\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function (doc, meta) {<br \/>\nif(doc.type &amp;&amp; doc.type == \"beer\") {<br \/>\nemit(doc.name);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<div class=\"p3\">\n<p>\u00c9 muito simples \"suportar\" o controle de vers\u00e3o sem afetar o c\u00f3digo existente, exceto a pr\u00f3pria exibi\u00e7\u00e3o. A nova exibi\u00e7\u00e3o precisa emitir chaves e valores somente para a vers\u00e3o atual do documento. Este \u00e9 o c\u00f3digo da nova exibi\u00e7\u00e3o:<\/p>\n<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function (doc, meta) {<br \/>\nif(doc.type &amp;&amp; doc.type == \"beer\" &amp;&amp; (meta.id).indexOf(\"::v\") == -1 ) {<br \/>\nemit(doc.name);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<div class=\"p3\">Com essa altera\u00e7\u00e3o, os aplicativos existentes que est\u00e3o usando essa visualiza\u00e7\u00e3o continuar\u00e3o a funcionar com o mesmo comportamento.<\/div>\n<div class=\"p2\">\n<h3>Implementa\u00e7\u00e3o do controle de vers\u00e3o<\/h3>\n<div>Com base nesse design, quando o aplicativo precisar fazer a vers\u00e3o do documento, dever\u00e1 ocorrer a seguinte l\u00f3gica:<\/div>\n<div>\n<ol>\n<li>Obter a vers\u00e3o atual do documento<\/li>\n<li>Aumentar o n\u00famero da vers\u00e3o (por exemplo, usando outra chave que mant\u00e9m o n\u00famero da vers\u00e3o para cada documento)<\/li>\n<li>Crie a vers\u00e3o com a nova chave \"mykey::v1\"<\/li>\n<li>Salvar a vers\u00e3o atual do documento<\/li>\n<\/ol>\n<div>Vamos dar uma olhada no c\u00f3digo em Java<\/div>\n<div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 Objeto obj = client.get(key);<br \/>\nSe (obj != null) {<br \/>\n\/\/ obter a pr\u00f3xima vers\u00e3o, criar ou usar a chave: mykey_version<br \/>\nlong version = client.incr(key + \"_version\", 1, 1);<br \/>\nString keyForVersion = key + \"::v\" + version; \/\/ mykey::v1<br \/>\ntente {<br \/>\nclient.set(keyForVersion, obj).get();<br \/>\n} catch (Exception e) {<br \/>\nlogger.severe(\"Cannot save version \"+ version + \" for key \"+ key +\" - Error: \"+ e.getMessage() );<br \/>\n}<br \/>\n}<br \/>\nclient.set(key, value);<\/div>\n<\/div>\n<p>Bastante simples, n\u00e3o \u00e9?<\/p>\n<\/div>\n<p>O aplicativo pode acessar o documento usando a chave, mas tamb\u00e9m pode obter uma vers\u00e3o ou a lista de todas as vers\u00f5es; esse \u00e9 um dos motivos pelos quais \u00e9 interessante criar uma chave (<span style=\"font-family: Courier New, Courier, monospace\">mykey_version<\/span>) e use-o tamb\u00e9m para excluir documentos e vers\u00f5es relacionadas.<\/p>\n<p>Com base no coment\u00e1rio anterior, a opera\u00e7\u00e3o de exclus\u00e3o tem a seguinte apar\u00eancia:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 Objeto obj = client.get(key);<br \/>\n\/\/ precisa excluir toda a vers\u00e3o primeiro<br \/>\nObjeto vObject = this.get(key + \"_version\");<br \/>\nSe (vObject != null) {<br \/>\nlong biggerVersion = Long.parseLong((String) vObject);<br \/>\ntente {<br \/>\n\/\/ excluir todas as vers\u00f5es<br \/>\nfor (int i = 1; i &lt;= biggerVersion; i++) {<br \/>\nString versionKey = key + \"::v\" + i;<br \/>\nclient.delete(versionKey).get();<br \/>\n}<br \/>\n\/\/ excluir o contador<br \/>\nclient.delete(key + \"_version\").get();<br \/>\n} catch (InterruptedException e) {<br \/>\ne.printStackTrace();<br \/>\n} catch (ExecutionException e) {<br \/>\ne.printStackTrace();<br \/>\n}<br \/>\n}<br \/>\nclient.delete(key);<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<h4>Usar controle de vers\u00e3o<\/h4>\n<div>Como exemplo, criei uma pequena biblioteca dispon\u00edvel no GitHub\u00a0<a href=\"https:\/\/github.com\/tgrall\/couchbase-how-to-versioning\">https:\/\/github.com\/tgrall\/couchbase-how-to-versioning<\/a>Como j\u00e1 foi dito, essa biblioteca estende o cliente do Couchbase e substitui algumas das opera\u00e7\u00f5es: set, replace e delete. (o b\u00e1sico: sem TLL, sem durabilidade) Como eu disse antes, este \u00e9 apenas um exemplo.<\/div>\n<div><\/div>\n<div><u>Cria\u00e7\u00e3o e instala\u00e7\u00e3o\u00a0<\/u><\/div>\n<div><\/div>\n<div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">git clone https:\/\/github.com\/tgrall\/couchbase-how-to-versioning.git<br \/>\ncd how-to-versioning<br \/>\nmvn instala\u00e7\u00e3o limpa<\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div>Em seguida, adicione essa biblioteca ao seu projeto, al\u00e9m do cliente Java do Couchbase, por exemplo, em seu pom.xml<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\n<p>&#8230;<\/p>\n<p>com.couchbase.howtos<br \/>\ncouchbase-como-fazer-vers\u00f5es<br \/>\n1.0-SNAPSHOT<\/p>\n<p>couchbase<br \/>\ncliente couchbase<br \/>\n1.1.8<br \/>\n&#8230;<\/p>\n<\/div>\n<\/div>\n<div>\n<p><u>Codifique seu aplicativo<\/u><\/p>\n<p>Crie um documento e fa\u00e7a uma vers\u00e3o dele:<\/p>\n<\/div>\n<div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0List uris = new LinkedList();<br \/>\nuris.add(URI.create(\"https:\/\/127.0.0.1:8091\/pools\"));<br \/>\nCouchbaseClientWithVersioning client = null<br \/>\ntente {<br \/>\ncliente = new CouchbaseClientWithVersioning(uris, \"default\", \"\");<br \/>\nString key = \"key-001\";<br \/>\nclient.set(key, \"This is the original version\");<br \/>\nSystem.out.printf(\"Original '%s' .n\", client.get(key));<br \/>\nclient.set(key, \"This is a new version\", true); \/\/ criar uma nova vers\u00e3o<br \/>\nSystem.out.printf(\"Vers\u00e3o atual '%s' .n\", client.get(key));<br \/>\nSystem.out.printf(\"Vers\u00e3o 1 '%s' .n\", client.get(key, 1));<br \/>\nclient.set(key, \"This is another version\", true); \/\/ criar uma nova vers\u00e3o<br \/>\nSystem.out.printf(\"Todas as vers\u00f5es %s .n\", client.getAllVersions(key));<br \/>\nclient.deleteVersion(key, 1); \/\/ criar uma nova vers\u00e3o<br \/>\nSystem.out.printf(\"Todas as vers\u00f5es %s (ap\u00f3s excluir 1 vers\u00e3o).n\", client.getAllVersions(key));<br \/>\nclient.delete(key); \/\/ criar uma nova vers\u00e3o<br \/>\nSystem.out.printf(\"Todas as vers\u00f5es %s (ap\u00f3s excluir a chave principal).n\", client.getAllVersions(key));<br \/>\n} catch (Exception e) {<br \/>\ne.printStackTrace();<br \/>\n}<br \/>\nSe (cliente !=nulo) {<br \/>\ncliente.shutdown();<br \/>\n}<\/div>\n<\/div>\n<p>Explica\u00e7\u00e3o r\u00e1pida:<\/p>\n<ul>\n<li>Linha 5: em vez de usar o\u00a0<span style=\"font-family: Courier New, Courier, monospace\">Cliente Couchbase<\/span>o aplicativo usa a extens\u00e3o \u00a0<span style=\"font-family: Courier New, Courier, monospace\">CouchbaseClientWithVersioning<\/span>\u00a0classe.<\/li>\n<li>Linha 7: criar uma nova entrada<\/li>\n<li>Linha 9: criar uma nova vers\u00e3o, o valor booleano para \"true\" for\u00e7a o controle de vers\u00e3o do documento<\/li>\n<li>O aplicativo usa outros m\u00e9todos, como obter uma vers\u00e3o espec\u00edfica (linha 11), obter todas as vers\u00f5es (linha 13), excluir uma vers\u00e3o espec\u00edfica (linha 14) e, finalmente, excluir a chave e todas as vers\u00f5es (linha 16).<\/li>\n<\/ul>\n<div>Portanto, usando essa abordagem, o desenvolvedor controla explicitamente quando criar uma vers\u00e3o, j\u00e1 que ele precisa adicionar o par\u00e2metro booleano na opera\u00e7\u00e3o de defini\u00e7\u00e3o. Nessa pequena biblioteca de exemplo, tamb\u00e9m \u00e9 poss\u00edvel fazer o controle de vers\u00e3o autom\u00e1tico; nesse caso, todas as chamadas de set e replace criar\u00e3o uma vers\u00e3o; para isso, o desenvolvedor s\u00f3 precisa chamar o m\u00e9todo setAutoVersioning(true). Algo como:<\/div>\n<div><\/div>\n<div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\u00a0 \u00a0 cliente = new CouchbaseClientWithVersioning(uris, \"default\", \"\");<br \/>\nclient.setAutomaticVersionning(true);<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Com essa abordagem, voc\u00ea pode fornecer controle de vers\u00e3o ao seu aplicativo com altera\u00e7\u00f5es m\u00ednimas no c\u00f3digo. Voc\u00ea pode test\u00e1-lo no aplicativo Beer Sample, mas n\u00e3o se esque\u00e7a de alterar as exibi\u00e7\u00f5es conforme o documentador acima para que retornem apenas\u00a0<i>atual<\/i>\u00a0vers\u00e3o dos documentos.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<div>Como voc\u00ea pode ver, fazer o controle de vers\u00e3o no Couchbase n\u00e3o \u00e9 t\u00e3o complicado, mas \u00e9 algo que deve ser feito pelo seu aplicativo com base em seus requisitos e restri\u00e7\u00f5es. Voc\u00ea tem muitas solu\u00e7\u00f5es diferentes e nenhuma dessas op\u00e7\u00f5es \u00e9 perfeita para todos os casos de uso.<\/div>\n<div><\/div>\n<div>\n<p>Neste c\u00f3digo de exemplo espec\u00edfico, estou trabalhando com um design simples em que crio uma c\u00f3pia dos documentos para cada vers\u00e3o. Com essa abordagem, tamb\u00e9m \u00e9 interessante mencionar que voc\u00ea pode versionar \"qualquer coisa\", n\u00e3o apenas o documento JSON, mas tamb\u00e9m quaisquer valores.  Como eu disse antes, essa \u00e9 uma abordagem poss\u00edvel e, como qualquer design, ela tem algum impacto sobre o aplicativo ou o banco de dados, neste caso, principalmente sobre o banco de dados:<\/p>\n<ul style=\"color: black;font-family: Times;font-size: medium;font-style: normal;font-variant: normal;font-weight: normal;letter-spacing: normal;line-height: normal;text-align: start;text-indent: 0px;text-transform: none\">\n<li>Aumentar o n\u00famero de chaves e documentos<\/li>\n<li>Dobrar - ou mais - o n\u00famero de opera\u00e7\u00f5es, por exemplo, ao atualizar um documento, o aplicativo precisa obter o valor atual, criar uma vers\u00e3o e salvar a vers\u00e3o atual.<\/li>\n<li>Gerenciamento de consist\u00eancia ao adicionar uma nova vers\u00e3o e incrementar o n\u00famero da vers\u00e3o (\u00e9 necess\u00e1rio lidar com erros ao criar uma nova vers\u00e3o, excluir as vers\u00f5es e contrair....)<\/li>\n<\/ul>\n<div>Muitos recursos poderiam ser adicionados a isso facilmente, por exemplo:<\/div>\n<div>\n<ul>\n<li>Limite para um n\u00famero espec\u00edfico de vers\u00f5es,<\/li>\n<li>Habilitar o controle de vers\u00e3o somente da opera\u00e7\u00e3o replace()<\/li>\n<li>Adicionar atributo espec\u00edfico sobre vers\u00f5es no documento JSON (por exemplo, data da vers\u00e3o)<\/li>\n<li>&#8230;.<\/li>\n<\/ul>\n<\/div>\n<div><\/div>\n<p>Se voc\u00ea estiver usando o controle de vers\u00e3o em seu aplicativo Couchbase, sinta-se \u00e0 vontade para comentar ou escrever um pequeno artigo que descreva a maneira como voc\u00ea est\u00e1 fazendo isso.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[This blog was syndicated from https:\/\/blog.grallandco.com] Introduction Developers are often asking me how to &#8220;version&#8221; documents with Couchbase 2.0. The short answer is: the clients and server do not expose such feature, but it is quite easy to implement. In [&hellip;]<\/p>","protected":false},"author":2,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8968],"class_list":["post-1628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Document Versioning: How to Implement with Couchbase<\/title>\n<meta name=\"description\" content=\"Wondering how to \u201cversion\u201d documents with Couchbase 2.0. Use the basic approach in this post and extend it depending of your business requirements.\" \/>\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\/how-implement-document-versioning-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to : Implement Document Versioning with Couchbase\" \/>\n<meta property=\"og:description\" content=\"Wondering how to \u201cversion\u201d documents with Couchbase 2.0. Use the basic approach in this post and extend it depending of your business requirements.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/how-implement-document-versioning-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-21T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-10T18:17:25+00:00\" \/>\n<meta name=\"author\" content=\"The Couchbase Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"The Couchbase Team\" \/>\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\/how-implement-document-versioning-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/\"},\"author\":{\"name\":\"The Couchbase Team\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93\"},\"headline\":\"How to : Implement Document Versioning with Couchbase\",\"datePublished\":\"2013-07-21T08:00:00+00:00\",\"dateModified\":\"2023-11-10T18:17:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/\"},\"wordCount\":1291,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/\",\"name\":\"Document Versioning: How to Implement with Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2013-07-21T08:00:00+00:00\",\"dateModified\":\"2023-11-10T18:17:25+00:00\",\"description\":\"Wondering how to \u201cversion\u201d documents with Couchbase 2.0. Use the basic approach in this post and extend it depending of your business requirements.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#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\/how-implement-document-versioning-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to : Implement Document Versioning with Couchbase\"}]},{\"@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\/764f4a6771ee19bc7af70b70a326fb93\",\"name\":\"The Couchbase Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"caption\":\"The Couchbase Team\"},\"description\":\"Jennifer Garcia is a Senior Web Manager at Couchbase Inc. As the website manager, Jennifer has overall responsibility for the website properties including design, implementation, content, and performance.\",\"sameAs\":[\"https:\/\/www.couchbase.com\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Controle de vers\u00e3o de documentos: Como implementar com o Couchbase","description":"Quer saber como \"versionar\" documentos com o Couchbase 2.0? Use a abordagem b\u00e1sica desta postagem e estenda-a dependendo de seus requisitos comerciais.","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\/how-implement-document-versioning-couchbase\/","og_locale":"pt_BR","og_type":"article","og_title":"How to : Implement Document Versioning with Couchbase","og_description":"Wondering how to \u201cversion\u201d documents with Couchbase 2.0. Use the basic approach in this post and extend it depending of your business requirements.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/how-implement-document-versioning-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2013-07-21T08:00:00+00:00","article_modified_time":"2023-11-10T18:17:25+00:00","author":"The Couchbase Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"The Couchbase Team","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/"},"author":{"name":"The Couchbase Team","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93"},"headline":"How to : Implement Document Versioning with Couchbase","datePublished":"2013-07-21T08:00:00+00:00","dateModified":"2023-11-10T18:17:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/"},"wordCount":1291,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/","name":"Controle de vers\u00e3o de documentos: Como implementar com o Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2013-07-21T08:00:00+00:00","dateModified":"2023-11-10T18:17:25+00:00","description":"Quer saber como \"versionar\" documentos com o Couchbase 2.0? Use a abordagem b\u00e1sica desta postagem e estenda-a dependendo de seus requisitos comerciais.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/how-implement-document-versioning-couchbase\/#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\/how-implement-document-versioning-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to : Implement Document Versioning with Couchbase"}]},{"@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\/764f4a6771ee19bc7af70b70a326fb93","name":"A equipe do Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3","url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","caption":"The Couchbase Team"},"description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho.","sameAs":["https:\/\/www.couchbase.com"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/"}]}},"authors":[{"term_id":8968,"user_id":2,"is_guest":0,"slug":"jennifer-garcia","display_name":"The Couchbase Team","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","author_category":"","last_name":"Garcia","first_name":"Jennifer","job_title":"","user_url":"https:\/\/www.couchbase.com","description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1628","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1628"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1628\/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=1628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1628"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}