{"id":10195,"date":"2021-06-09T04:05:56","date_gmt":"2021-06-09T11:05:56","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=10195"},"modified":"2025-06-13T22:39:24","modified_gmt":"2025-06-14T05:39:24","slug":"eventing-introducing-advanced-bucket-accessors-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/eventing-introducing-advanced-bucket-accessors-couchbase\/","title":{"rendered":"Eventos: Apresentando os acessores avan\u00e7ados de bucket no Couchbase"},"content":{"rendered":"<p>Os Advanced Bucket Accessors no Couchbase possibilitam o acesso \u00e0 funcionalidade avan\u00e7ada do armazenamento de valores-chave (KV) usando os seguintes operadores internos.<\/p>\n<p>Eles utilizam os mesmos v\u00ednculos de bucket definidos no manipulador como Basic Bucket Accessors, mas exp\u00f5em um conjunto mais rico de op\u00e7\u00f5es e operadores que podem ser usados para:<\/p>\n<ol>\n<li>Definir ou recuperar expira\u00e7\u00f5es<\/li>\n<li>Resolver condi\u00e7\u00f5es de corrida por meio do CAS<\/li>\n<li>Manipular itens de KV quentes sob alta conten\u00e7\u00e3o<\/li>\n<\/ol>\n<p>Observe que <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-language-constructs.html?ref=blog#bucket_accessors\" target=\"_blank\" rel=\"noopener noreferrer\">Acessores b\u00e1sicos de bucket<\/a> s\u00e3o muito mais f\u00e1ceis de usar, t\u00eam uma API trivial e tamb\u00e9m s\u00e3o um pouco mais r\u00e1pidos do que os correspondentes Advanced Bucket Accessors.<\/p>\n<p>No Couchbase Server 6.6.1, foram adicionados os seguintes acessores avan\u00e7ados de bucket:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"#advanced-get-op\">Opera\u00e7\u00e3o GET avan\u00e7ada<\/a><\/li>\n<li><a href=\"#advanced-insert-op\">Opera\u00e7\u00e3o INSERT avan\u00e7ada<\/a><\/li>\n<li><a href=\"#advanced-upsert-op\">Opera\u00e7\u00e3o avan\u00e7ada do UPSERT<\/a><\/li>\n<li><a href=\"#advanced-replace-op\">Opera\u00e7\u00e3o REPLACE avan\u00e7ada<\/a><\/li>\n<li><a href=\"#advanced-delete-op\">Opera\u00e7\u00e3o DELETE avan\u00e7ada<\/a><\/li>\n<li><a href=\"#advanced-increment-op\">Opera\u00e7\u00e3o INCREMENT avan\u00e7ada<\/a><\/li>\n<li><a href=\"#advanced-decrement-op\">Opera\u00e7\u00e3o avan\u00e7ada de DECREMENTO<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Esses sete novos Bucket Accessors permitem utilizar e aproveitar o CAS diretamente para lidar com a conten\u00e7\u00e3o e\/ou definir a expira\u00e7\u00e3o de um documento (ou <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/how-to-manage-ttl-with-couchbase-n1ql\/\">TTL<\/a>) no servi\u00e7o de dados (ou KV) via <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/eventing\/\">Eventos<\/a> al\u00e9m de realizar opera\u00e7\u00f5es de contador at\u00f4mico distribu\u00eddo.<\/p>\n<p>Por exemplo, em vez de confiar cegamente nos Basic Bucket Accessors para uma opera\u00e7\u00e3o do tipo upsert <code>src_bkt[id_str] = algum_doc<\/code>Com os Advanced Accessors, voc\u00ea pode resolver a conten\u00e7\u00e3o (ou poss\u00edvel conten\u00e7\u00e3o) em chaves que t\u00eam muta\u00e7\u00f5es simult\u00e2neas de diferentes origens com l\u00f3gica orientada por JavaScript em sua Eventing Function.<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Se o documento n\u00e3o existir, voc\u00ea poder\u00e1 usar <code>couchbase.insert(src_bkt, {\"id: id_str}, some_doc)<\/code> e verificar se o valor de retorno \u00e9 bem-sucedido<\/li>\n<li>Se o documento existir, voc\u00ea poder\u00e1 usar <code>couchbase.replace(src_bkt, {\"id: id_str, \"cas\": current_cas}, some_doc)<\/code> e verificar se o valor de retorno \u00e9 bem-sucedido ou se h\u00e1 uma incompatibilidade de CAS.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Para ver exemplos completos, incluindo JavaScript, muta\u00e7\u00f5es de entrada, muta\u00e7\u00f5es de sa\u00edda e\/ou mensagens de registro para cada Advanced Bucket Accessor, consulte <a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-examples.html?ref=blog#examples-scriptlets-advanced-accessors\" target=\"_blank\" rel=\"noopener noreferrer\">Scriptlets: Manipuladores de acessores avan\u00e7ados<\/a> na se\u00e7\u00e3o de exemplos da documenta\u00e7\u00e3o.<\/p>\n<p><strong id=\"advanced-get-op\">GET avan\u00e7ado:<\/strong> resultado = <code>couchbase.get(binding, meta)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o permite ler um documento junto com metadados do bucket e opera\u00e7\u00f5es subsequentes para utilizar o CAS ou verificar\/modificar o <code>data de expira\u00e7\u00e3o<\/code>.<\/p>\n<p>Compare isso com o Basic Bucket Accessor <code>OBTER<\/code> que simplesmente exp\u00f5e uma liga\u00e7\u00e3o ou um mapa JavaScript, <code>var adoc = src_bkt[meta.id]<\/code>onde o valor de retorno \u00e9 apenas o documento sem nenhum metadado.<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>OBTER<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input doc ', doc);\r\n    log('input meta', meta);\r\n    \/\/ could be the same or different\r\n    var new_meta = {\"id\":\"test_adv_get::1\"};\r\n    var result = couchbase.get(src_bkt,new_meta);\r\n    if (result.success) {\r\n        log('success adv. get: result',result);\r\n    } else {\r\n        log('failure adv. get: id',new_meta.id,'result',result);\r\n    }\r\n}<\/pre>\n<p>Alguns exemplos de valores de retorno:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"doc\": {\r\n        \"id\": 1,\r\n        \"type\": \"test_adv_get\"\r\n    },\r\n    \"meta\": {\r\n        \"id\": \"test_adv_get::1\",\r\n        \"cas\": \"1610034762747412480\",\r\n        \"data_type\": \"json\"\r\n    },\r\n    \"success\": true\r\n}\r\n\r\n{\r\n    \"doc\": {\r\n        \"a\": 1,\r\n        \"random\": 0.09799092443129842\r\n    },\r\n    \"meta\": {\r\n        \"id\": \"test_adv_insert:1\",\r\n        \"cas\": \"1610140272584884224\",\r\n        \"expiry_date\": \"2021-01-08T21:12:12.000Z\",\r\n        \"data_type\": \"json\"\r\n    },\r\n    \"success\": true\r\n}\r\n\r\n{\r\n    \"error\": {\r\n        \"code\": 272,\r\n        \"name\": \"LCB_KEY_ENOENT\",\r\n        \"desc\": \"The document key does not exist on the server\",\r\n        \"key_not_found\": true\r\n    },\r\n    \"success\": false\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-insert-op\">INSER\u00c7\u00c3O avan\u00e7ada<\/strong>: resultado = <code>couchbase.insert(binding, meta, doc)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o permite criar um novo documento no bucket. Essa opera\u00e7\u00e3o falhar\u00e1 se o documento com a chave especificada j\u00e1 existir. Permite especificar um tempo de expira\u00e7\u00e3o (ou TTL) a ser definido no documento.<\/p>\n<p>N\u00e3o h\u00e1 nenhuma opera\u00e7\u00e3o do Basic Bucket Accessor an\u00e1loga \u00e0 do Advanced <code>INSERIR<\/code> opera\u00e7\u00e3o (como <code>src_bkt[meta.id] = adoc<\/code> \u00e9 mais como um upsert).<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>INSERIR<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n    \/\/ could be the same or different\r\n    var new_meta = {\"id\":\"test_adv_insert:1\"};\r\n    \/\/ optional set an expiry 60 seconds in the future\r\n    \/\/ new_meta.expiry_date = new Date(Date.now() + 60 * 1000);\r\n    var new_doc = doc;\r\n    new_doc.random = Math.random();\r\n    var result = couchbase.insert(src_bkt,new_meta,new_doc);\r\n    if (result.success) {\r\n        log('success adv. insert: result',result);\r\n    } else {\r\n        log('failure adv. insert: id',new_meta.id,'result',result);\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Alguns exemplos de valores de retorno:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"meta\": {\r\n        \"id\": \"test_adv_insert:1\",\r\n        \"cas\": \"1610041053310025728\"\r\n    },\r\n    \"success\": true\r\n}\r\n\r\n{\r\n    \"error\": {\r\n        \"code\": 272,\r\n        \"name\": \"LCB_KEY_EEXISTS\",\r\n        \"desc\": \"The document key already exists in the server.\",\r\n        \"key_already_exists\": true\r\n    },\r\n    \"success\": false\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-upsert-op\">UPSERT avan\u00e7ado<\/strong>: resultado = <code>couchbase.upsert(binding, meta, doc)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o permite atualizar um documento existente no bucket ou, se n\u00e3o houver, criar um novo documento com a chave especificada. A opera\u00e7\u00e3o n\u00e3o permite especificar o CAS (ele ser\u00e1 silenciosamente ignorado). Ela tamb\u00e9m permite especificar um tempo de expira\u00e7\u00e3o (ou TTL) a ser definido no documento.<\/p>\n<p>Compare isso com o Basic Bucket Accessor <code>CONJUNTO<\/code> que simplesmente usa um mapa JavaScript exposto definido por meio de um alias de vincula\u00e7\u00e3o de bucket <code>src_bkt[meta.id] = adoc<\/code>. Para o b\u00e1sico <code>CONJUNTO<\/code> n\u00e3o h\u00e1 valor de retorno (sem status e sem metadados) e, portanto, n\u00e3o h\u00e1 como verificar o valor do CAS.<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>UPSERT<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n    \/\/ could be the same or different\r\n    var new_meta = {\"id\":\"test_adv_upsert:1\"}; \/\/ CAS if supplied will be ignored\r\n    \/\/ optional set an expiry 60 seconds in the future\r\n    \/\/ new_meta.expiry_date = new Date(Date.now() + 60 * 1000);\r\n    var new_doc = doc;\r\n    new_doc.random = Math.random();\r\n    var result = couchbase.upsert(src_bkt,new_meta,new_doc);\r\n    if (result.success) {\r\n        log('success adv. upsert: result',result);\r\n    } else {\r\n        log('failure adv. upsert: id',new_meta.id,'result',result);\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Um exemplo de valor de retorno:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"meta\": {\r\n        \"id\": \"test_adv_upsert:1\",\r\n        \"cas\": \"1610127444908376064\"\r\n    },\r\n    \"success\": true\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-replace-op\">REPLACE avan\u00e7ado<\/strong>: resultado = <code>couchbase.replace(binding, meta, doc)<\/code><\/p>\n<p>Esta opera\u00e7\u00e3o substitui um documento existente no bucket. Essa opera\u00e7\u00e3o falhar\u00e1 se o documento com a chave especificada n\u00e3o existir. Essa opera\u00e7\u00e3o permite especificar um valor CAS que deve ser correspondido como uma pr\u00e9-condi\u00e7\u00e3o antes de prosseguir com a opera\u00e7\u00e3o. Ela tamb\u00e9m permite especificar um tempo de expira\u00e7\u00e3o (ou TTL) a ser definido no documento.<\/p>\n<p>N\u00e3o h\u00e1 nenhuma opera\u00e7\u00e3o do Basic Bucket Accessor an\u00e1loga \u00e0 do Advanced <code>SUBSTITUIR<\/code> opera\u00e7\u00e3o (como <code>src_bkt[meta.id] = adoc<\/code> \u00e9 mais como um upsert).<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>SUBSTITUIR<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n\r\n    var mode = 3; \/\/ 1-&gt; no CA, 2-&gt; mismatch in CA, 3-&gt; good CAS\r\n\r\n    \/\/ Setup, make sure we have our doc to \"replace\", ignore any errors\r\n    couchbase.insert(src_bkt,{\"id\":\"test_adv_replace:10\"},{\"a:\": 1});\r\n\r\n    var new_meta;\r\n    if (mode === 1) {\r\n        \/\/ If we pass no CAS it will succeed\r\n        new_meta = {\"id\":\"test_adv_replace:10\"};\r\n        \/\/ optional set an expiry 60 seconds in the future\r\n        \/\/ new_meta.expiry_date = new Date(Date.now() + 60 * 1000);\r\n    }\r\n    if (mode === 2) {\r\n        \/\/ If we pass a non-matching CAS it will fail, so test this\r\n        new_meta = {\"id\":\"test_adv_replace:10\", \"cas\":\"1111111111111111111\"};\r\n    }\r\n    if (mode === 3) {\r\n        \/\/ If we pass the matching or current CAS it will succeed\r\n        var tmp_r = couchbase.get(src_bkt,{\"id\":\"test_adv_replace:10\"});\r\n        if (tmp_r.success) {\r\n            \/\/ Here we use the current CAS just read via couchbase.get(...)\r\n            new_meta = {\"id\":\"test_adv_replace:10\", \"cas\": tmp_r.meta.cas};\r\n        } else {\r\n            log('Cannot replace non-existing key that create it and rerun',\"test_adv_replace:10\");\r\n            return;\r\n        }\r\n    }\r\n    var new_doc = doc;\r\n    new_doc.random = Math.random();\r\n    var result = couchbase.replace(src_bkt,new_meta,new_doc);\r\n    if (result.success) {\r\n        log('success adv. replace: result',result);\r\n    } else {\r\n        log('failure adv. replace: id',new_meta.id,'result',result);\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Alguns exemplos de valores de retorno:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"meta\": {\r\n        \"id\": \"test_adv_replace:10\",\r\n        \"cas\": \"1610130177286144000\"\r\n    },\r\n    \"success\": true\r\n}\r\n\r\n{\r\n    \"error\": {\r\n        \"code\": 272,\r\n        \"name\": \"LCB_KEY_EEXISTS\",\r\n        \"desc\": \"The document key exists with a CAS value different than specified\",\r\n        \"cas_mismatch\": true\r\n    },\r\n    \"success\": false\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-delete-op\">DELETE avan\u00e7ado<\/strong>: resultado = <code>couchbase.delete(binding, meta)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o permite excluir um documento no compartimento especificado pela chave. Opcionalmente, pode ser especificado um valor CAS que ser\u00e1 correspondido como uma pr\u00e9-condi\u00e7\u00e3o para prosseguir com a opera\u00e7\u00e3o.<\/p>\n<p>Compare isso com o Basic Bucket Accessor <code>DEL<\/code> que simplesmente usa uma liga\u00e7\u00e3o ou um mapa JavaScript exposto, <code>excluir src_bkt[meta.id]<\/code>onde n\u00e3o h\u00e1 valor de retorno (sem status e sem metadados).<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>DELETE<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n\r\n    var mode = 4; \/\/ 1-&gt; no CA, 2-&gt; mismatch in CA, 3-&gt; good CAS, 4-&gt; no such key\r\n\r\n    \/\/ Setup, make sure we have our doc to \"delete\", ignore any errors\r\n    couchbase.insert(src_bkt,{\"id\":\"test_adv_delete:10\"},{\"a:\": 1});\r\n\r\n    var new_meta;\r\n    if (mode === 1) {\r\n        \/\/ If we pass no CAS it will succeed\r\n        new_meta = {\"id\":\"test_adv_delete:10\"};\r\n        \/\/ optional set an expiry 60 seconds in the future\r\n        \/\/ new_meta.expiry_date = new Date(Date.now() + 60 * 1000);\r\n    }\r\n    if (mode === 2) {\r\n        \/\/ If we pass a non-matching CAS it will fail, so test this\r\n        new_meta = {\"id\":\"test_adv_delete:10\", \"cas\":\"1111111111111111111\"};\r\n    }\r\n    if (mode === 3) {\r\n        \/\/ If we pass the matching or current CAS it will succeed\r\n        var tmp_r = couchbase.get(src_bkt,{\"id\":\"test_adv_delete:10\"});\r\n        if (tmp_r.success) {\r\n            \/\/ Here we use the current CAS just read via couchbase.get(...)\r\n            new_meta = {\"id\":\"test_adv_delete:10\", \"cas\": tmp_r.meta.cas};\r\n        } else {\r\n            log('Cannot delete non-existing key that create it and rerun',\"test_adv_delete:10\");\r\n            return;\r\n        }\r\n    }\r\n    if (mode === 4) {\r\n        \/\/ Remove so that we have: no such key\r\n        delete src_bkt[\"test_adv_delete:10\"]\r\n        new_meta = {\"id\":\"test_adv_delete:10\"};\r\n    }\r\n    var result = couchbase.delete(src_bkt,new_meta);\r\n    if (result.success) {\r\n        log('success adv. delete: result',result);\r\n    } else {\r\n        log('failure adv. delete: id',new_meta.id,'result',result);\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Alguns exemplos de valores de retorno:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"meta\": {\r\n        \"id\": \"key::10\",\r\n        \"cas\": \"1609374065129816064\"\r\n    },\r\n    \"success\": true\r\n}\r\n\r\n{\r\n    \"error\": {\r\n        \"code\": 272,\r\n        \"name\": \"LCB_KEY_EEXISTS\",\r\n        \"desc\": \"The document key exists with a CAS value different than specified\",\r\n        \"cas_mismatch\": true\r\n    },\r\n    \"success\": false\r\n}\r\n\r\n{\r\n    \"error\": {\r\n        \"code\": 272,\r\n        \"name\": \"LCB_KEY_ENOENT\",\r\n        \"desc\": \"The document key does not exist on the server\",\r\n        \"key_not_found\": true\r\n    },\r\n    \"success\": false\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-increment-op\">INCREMENTO avan\u00e7ado<\/strong>: resultado = <code>couchbase.increment(binding, meta)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o incrementa atomicamente o campo <code>contagem<\/code> no documento especificado. O documento deve ter a estrutura abaixo:<\/p>\n<pre class=\"lang:js decode:true\">{\"count\": 23} \/\/ 23 is the current counter value\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>O <code>incremento<\/code> retorna o valor p\u00f3s-incremento.<\/p>\n<p>Se o documento do contador especificado n\u00e3o existir, ser\u00e1 criado um com <code>contagem<\/code> como 0 e a estrutura mencionada acima. Assim, o primeiro valor retornado ser\u00e1 1.<\/p>\n<p>Devido a limita\u00e7\u00f5es na API do mecanismo KV, essa opera\u00e7\u00e3o n\u00e3o pode manipular contadores de documentos completos no momento.<\/p>\n<p>N\u00e3o h\u00e1 nenhuma opera\u00e7\u00e3o do Basic Bucket Accessor an\u00e1loga \u00e0 do Advanced <code>INCREMENTO<\/code> opera\u00e7\u00e3o.<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>INCREMENTO<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n\r\n    \/\/ if doc.count doesn't exist it will be created\r\n    var ctr_meta = {\"id\": \"my_atomic_counter:1\" };\r\n    var result = couchbase.increment(src_bkt,ctr_meta);\r\n    if (result.success) {\r\n        log('success adv. increment: result',result);\r\n    } else {\r\n        log('failure adv. increment: id',ctr_meta.id,'result',result);\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Um exemplo de valor de retorno, supondo que voc\u00ea crie este <code>KEY \"my_atomic_counter:1\" DOC {\"count\": 23}<\/code> Se a fun\u00e7\u00e3o Eventing acima for implementada, a contagem ser\u00e1 imediatamente incrementada:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"doc\": {\r\n        \"count\": 24\r\n    },\r\n    \"meta\": {\r\n        \"id\": \"key::1\",\r\n        \"cas\": \"1609374571840471040\"\r\n    },\r\n    \"success\": true\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong id=\"advanced-decrement-op\">DECREMENTO avan\u00e7ado<\/strong>: resultado = <code>couchbase.decrement(binding, meta)<\/code><\/p>\n<p>Essa opera\u00e7\u00e3o diminui atomicamente o campo <code>contagem<\/code> no documento especificado. O documento deve ter a estrutura abaixo:<\/p>\n<pre class=\"lang:js decode:true\">{\"count\": 23} \/\/ 23 is the current counter value\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>O <code>decr\u00e9scimo<\/code> retorna o valor p\u00f3s-decremento.<\/p>\n<p>Se o documento do contador especificado n\u00e3o existir, ser\u00e1 criado um com a fun\u00e7\u00e3o <code>contagem<\/code> como 0 e a estrutura mencionada acima. Como resultado, o primeiro valor retornado ser\u00e1 -1.<\/p>\n<p>Devido a limita\u00e7\u00f5es na API do mecanismo KV, essa opera\u00e7\u00e3o n\u00e3o pode manipular contadores de documentos completos no momento.<\/p>\n<p>N\u00e3o h\u00e1 nenhuma opera\u00e7\u00e3o do Basic Bucket Accessor an\u00e1loga \u00e0 do Advanced <code>DECREMENTO<\/code> opera\u00e7\u00e3o.<\/p>\n<p>Abaixo est\u00e1 um exemplo do Advanced <code>DECREMENTO<\/code> opera\u00e7\u00e3o.<\/p>\n<pre class=\"lang:js decode:true\">function OnUpdate(doc, meta) {\r\n    log('input meta', meta);\r\n    log('input doc ', doc);\r\n\r\n    \/\/ if doc.count doesn't exist it will be created\r\n    var ctr_meta = {\"id\": \"my_atomic_counter:1\" };\r\n    var result = couchbase.decrement(src_bkt,ctr_meta);\r\n    if (result.success) {\r\n        log('success adv. decrement: result',result);\r\n    } else {\r\n        log('failure adv. decrement: id',ctr_meta.id,'result',result);\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Um exemplo de valor de retorno, supondo que voc\u00ea crie este <code>KEY \"my_atomic_counter:1\" DOC {\"count\": 23}<\/code> Se a fun\u00e7\u00e3o Eventing acima for implementada, a contagem ser\u00e1 imediatamente diminu\u00edda:<\/p>\n<pre class=\"lang:js decode:true\">{\r\n    \"doc\": {\r\n        \"count\": 22\r\n    },\r\n    \"meta\": {\r\n        \"id\": \"key::1\",\r\n        \"cas\": \"1609374770297176064\"\r\n    },\r\n    \"success\": true\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Refer\u00eancias<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-overview.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o de eventos do Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-advanced-keyspace-accessors.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o dos acessores avan\u00e7ados de eventos do Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-examples.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Exemplos de eventos do Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/introduction\/whats-new.html?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase Server 6.6 O que h\u00e1 de novo<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/eventing\/?ref=blog\" target=\"_blank\" rel=\"noopener noreferrer\">Blogs do Couchbase sobre eventos<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Advanced Bucket Accessors in Couchbase make it possible to access advanced key-value store (KV) functionality using the following built-in operators. They utilize the same bucket bindings defined in the handler as Basic Bucket Accessors, but expose a richer set of [&hellip;]<\/p>","protected":false},"author":42711,"featured_media":10196,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2273,9327],"tags":[1543,9247,1991],"ppma_author":[9113],"class_list":["post-10195","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-eventing","category-javascript","tag-javascript","tag-key-value-store","tag-ttl"],"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>Eventing: Introducing Advanced Bucket Accessors in Couchbase<\/title>\n<meta name=\"description\" content=\"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.\" \/>\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\/eventing-introducing-advanced-bucket-accessors-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Eventing: Introducing Advanced Bucket Accessors in Couchbase\" \/>\n<meta property=\"og:description\" content=\"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/eventing-introducing-advanced-bucket-accessors-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-06-09T11:05:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:39:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jon Strabala, Principal Product Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/\"},\"author\":{\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc\"},\"headline\":\"Eventing: Introducing Advanced Bucket Accessors in Couchbase\",\"datePublished\":\"2021-06-09T11:05:56+00:00\",\"dateModified\":\"2025-06-14T05:39:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/\"},\"wordCount\":939,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png\",\"keywords\":[\"javascript\",\"key-value store\",\"TTL\"],\"articleSection\":[\"Couchbase Server\",\"Eventing\",\"JavaScript\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/\",\"name\":\"Eventing: Introducing Advanced Bucket Accessors in Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png\",\"datePublished\":\"2021-06-09T11:05:56+00:00\",\"dateModified\":\"2025-06-14T05:39:24+00:00\",\"description\":\"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png\",\"width\":1200,\"height\":628,\"caption\":\"Learn how to use Advanced Bucket Accessors in Couchbase for key-value store Eventing\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Eventing: Introducing Advanced Bucket Accessors in 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\/c991579f88217edee79ffedb6fc914cc\",\"name\":\"Jon Strabala, Principal Product Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g\",\"caption\":\"Jon Strabala, Principal Product Manager, Couchbase\"},\"description\":\"Jon Strabala is a Principal Product Manager, responsible for the Couchbase Eventing Service. Before joining Couchbase, he spent more than 20 years building software products across various domains, starting with EDA in aerospace then transitioning to building enterprise software focused on what today is coined \u201cIoT\u201d and \u201cat-scale data.\u201d Jon worked for several small software consultancies until eventually starting and managing his own firm. He has extensive experience in NoSQL\/NewSQL, both in contributing and commercializing new technologies such as compressed bitmaps and column stores. Jon holds a bachelor\u2019s degree in electrical engineering and a master's in computer engineering, both from the University of Southern California, and an MBA from the University of California at Irvine.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jon-strabala\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Eventos: Apresentando os acessores avan\u00e7ados de bucket no Couchbase","description":"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.","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\/eventing-introducing-advanced-bucket-accessors-couchbase\/","og_locale":"pt_BR","og_type":"article","og_title":"Eventing: Introducing Advanced Bucket Accessors in Couchbase","og_description":"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/eventing-introducing-advanced-bucket-accessors-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-06-09T11:05:56+00:00","article_modified_time":"2025-06-14T05:39:24+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png","type":"image\/png"}],"author":"Jon Strabala, Principal Product Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jon Strabala, Principal Product Manager, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/"},"author":{"name":"Jon Strabala, Principal Product Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c991579f88217edee79ffedb6fc914cc"},"headline":"Eventing: Introducing Advanced Bucket Accessors in Couchbase","datePublished":"2021-06-09T11:05:56+00:00","dateModified":"2025-06-14T05:39:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/"},"wordCount":939,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png","keywords":["javascript","key-value store","TTL"],"articleSection":["Couchbase Server","Eventing","JavaScript"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/","name":"Eventos: Apresentando os acessores avan\u00e7ados de bucket no Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png","datePublished":"2021-06-09T11:05:56+00:00","dateModified":"2025-06-14T05:39:24+00:00","description":"Learn how to implement Advanced Bucket Accessors in Couchbase Server for Eventing to get direct access to TTLs, CAS values and more key-value functionality.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/01\/banner.png","width":1200,"height":628,"caption":"Learn how to use Advanced Bucket Accessors in Couchbase for key-value store Eventing"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/eventing-introducing-advanced-bucket-accessors-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Eventing: Introducing Advanced Bucket Accessors in 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\/c991579f88217edee79ffedb6fc914cc","name":"Jon Strabala, gerente principal de produtos da Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9c6045b0c2f7b07b0ee10f94ad748a25","url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","caption":"Jon Strabala, Principal Product Manager, Couchbase"},"description":"Jon Strabala \u00e9 gerente de produto principal, respons\u00e1vel pelo Couchbase Eventing Service. Antes de ingressar na Couchbase, ele passou mais de 20 anos criando produtos de software em v\u00e1rios dom\u00ednios, come\u00e7ando com EDA no setor aeroespacial e depois fazendo a transi\u00e7\u00e3o para a cria\u00e7\u00e3o de software corporativo com foco no que hoje \u00e9 chamado de \"IoT\" e \"dados em escala\". Jon trabalhou em v\u00e1rias pequenas empresas de consultoria de software at\u00e9 abrir e gerenciar sua pr\u00f3pria empresa. Ele tem ampla experi\u00eancia em NoSQL\/NewSQL, tanto na contribui\u00e7\u00e3o quanto na comercializa\u00e7\u00e3o de novas tecnologias, como bitmaps compactados e armazenamentos de colunas. Jon \u00e9 bacharel em engenharia el\u00e9trica e mestre em engenharia da computa\u00e7\u00e3o, ambos pela Universidade do Sul da Calif\u00f3rnia, e tem MBA pela Universidade da Calif\u00f3rnia em Irvine.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jon-strabala\/"}]}},"authors":[{"term_id":9113,"user_id":42711,"is_guest":0,"slug":"jon-strabala","display_name":"Jon Strabala, Principal Product Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/db52a9f6d84faba430dd38106cdbc16ff02c2066b103b5f6b4cfcde40e83c683?s=96&d=mm&r=g","first_name":"Jon","last_name":"Strabala, Principal Product Manager, Couchbase","user_url":"","author_category":"","description":"Jon Strabala \u00e9 gerente de produto principal, respons\u00e1vel pelo Couchbase Eventing Service. Antes de ingressar na Couchbase, ele passou mais de 20 anos criando produtos de software em v\u00e1rios dom\u00ednios, come\u00e7ando com EDA no setor aeroespacial e depois fazendo a transi\u00e7\u00e3o para a cria\u00e7\u00e3o de software corporativo com foco no que hoje \u00e9 chamado de \"IoT\" e \"dados em escala\". Jon trabalhou em v\u00e1rias pequenas empresas de consultoria de software at\u00e9 abrir e gerenciar sua pr\u00f3pria empresa. Ele tem ampla experi\u00eancia em NoSQL\/NewSQL, tanto na contribui\u00e7\u00e3o quanto na comercializa\u00e7\u00e3o de novas tecnologias, como bitmaps compactados e armazenamentos de colunas. Jon \u00e9 bacharel em engenharia el\u00e9trica e mestre em engenharia da computa\u00e7\u00e3o, ambos pela Universidade do Sul da Calif\u00f3rnia, e tem MBA pela Universidade da Calif\u00f3rnia em Irvine."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/10195","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\/42711"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=10195"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/10195\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10196"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=10195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=10195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=10195"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=10195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}