{"id":2165,"date":"2016-02-19T09:57:34","date_gmt":"2016-02-19T09:57:33","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2165"},"modified":"2024-09-12T01:12:39","modified_gmt":"2024-09-12T08:12:39","slug":"moving-from-mongodb-to-couchbase-server","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-mongodb-to-couchbase-server\/","title":{"rendered":"Mudan\u00e7a do MongoDB para o Couchbase Server"},"content":{"rendered":"<h2 id=\"moving-from-mongodb-to-couchbase-server\">Mudan\u00e7a do MongoDB para o servidor Couchbase<\/h2>\n<p>Este \u00e9 um guia focado no desenvolvedor para mover o armazenamento de dados do seu aplicativo do MongoDB para o Couchbase Server, seguindo o guia de Laurent <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-sql-database-content-to-couchbase\/\">guia para fazer a mudan\u00e7a do PostgreSQL<\/a>.<\/p>\n<p>Embora n\u00e3o cubra todos os casos, ele oferece dicas sobre o que deve ser considerado ao planejar a migra\u00e7\u00e3o.<\/p>\n<h2 id=\"versions\">Vers\u00f5es<\/h2>\n<p>Este guia foi escrito para o Couchbase Server 4.1 e o MongoDB 3.2.<\/p>\n<h2 id=\"key-differences\">Principais diferen\u00e7as<\/h2>\n<p>O Couchbase Server e o MongoDB s\u00e3o armazenamentos de documentos que podem operar em um ou v\u00e1rios servidores. No entanto, eles abordam as coisas de maneiras significativamente diferentes.<\/p>\n<p>Ao iniciar sua migra\u00e7\u00e3o do MongoDB para o Couchbase Server, voc\u00ea precisar\u00e1 considerar as seguintes diferen\u00e7as:<\/p>\n<table>\n<thead>\n<tr class=\"header\">\n<th><\/th>\n<th>Servidor Couchbase<\/th>\n<th>MongoDB<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td><strong>Modelos de dados<\/strong><\/td>\n<td>Documento, valor-chave<\/td>\n<td>Documento<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><strong>Consulta<\/strong><\/td>\n<td>N1QL (SQL para JSON), visualiza\u00e7\u00f5es de mapa\/redu\u00e7\u00e3o, valor-chave<\/td>\n<td>Consulta ad-hoc, agrega\u00e7\u00e3o de mapa\/redu\u00e7\u00e3o<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td><strong>Concorr\u00eancia<\/strong><\/td>\n<td>Bloqueio otimista e pessimista<\/td>\n<td>\n<table style=\"color: #333333;line-height: 20.8px;text-align: left\">\n<tbody>\n<tr class=\"odd\">\n<td>Bloqueio otimista e pessimista, com o WiredTiger<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><strong>Modelo de escala<\/strong><\/td>\n<td>Mestre-mestre distribu\u00eddo<\/td>\n<td>Mestre-escravo com conjuntos de r\u00e9plicas<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"data-model\">Modelo de dados<\/h2>\n<p>O Couchbase Server \u00e9 um armazenamento de documentos e um armazenamento de valores-chave.<\/p>\n<p>Tudo come\u00e7a com chave-valor, pois cada documento tem uma chave que voc\u00ea pode usar para obter e definir o conte\u00fado do documento. No entanto, voc\u00ea pode usar o Couchbase Server como um banco de dados de documentos, indexando e consultando o conte\u00fado dos documentos.<\/p>\n<h3 id=\"differences-between-bson-and-json\">Diferen\u00e7as entre BSON e JSON<\/h3>\n<p>\u00c9 prov\u00e1vel que seu aplicativo armazene documentos do tipo JSON no MongoDB, portanto, come\u00e7aremos por ele.<\/p>\n<p>O MongoDB armazena dados no formato BSON, que \u00e9 um formato bin\u00e1rio semelhante ao JSON. A principal diferen\u00e7a para n\u00f3s \u00e9 que o BSON registra informa\u00e7\u00f5es adicionais de tipo.<\/p>\n<p>Quando voc\u00ea exporta dados do MongoDB usando uma ferramenta como <em>mongoexporta\u00e7\u00e3o<\/em> a ferramenta produzir\u00e1 JSON que preserva essas informa\u00e7\u00f5es de tipo em um formato chamado Extended JSON.<\/p>\n<p>Vamos dar uma olhada em um exemplo. Primeiro em JSON padr\u00e3o:<\/p>\n<pre><code>{\r\n  \"created_at\": \"2016-01-27T16:00:58+00:00\"\r\n}<\/code><\/pre>\n<p>E agora no JSON estendido:<\/p>\n<pre><code>{\r\n  \"created_at\": {\r\n    \"$date\": \"1453910458\"\r\n  }\r\n}<\/code><\/pre>\n<p>Como voc\u00ea pode ver, o JSON estendido ainda \u00e9 um JSON v\u00e1lido. Isso significa que voc\u00ea pode armazenar, indexar, consultar e recuper\u00e1-lo usando o Couchbase Server. No entanto, voc\u00ea precisar\u00e1 manter essas informa\u00e7\u00f5es adicionais de tipo na camada do aplicativo.<\/p>\n<p>Como alternativa, voc\u00ea pode converter o JSON estendido em JSON padr\u00e3o antes de import\u00e1-lo para o Couchbase Server.<\/p>\n<h3 id=\"non-json-data\">Dados n\u00e3o JSON<\/h3>\n<p>Tanto o MongoDB quanto o Couchbase Server podem armazenar dados bin\u00e1rios opacos.<\/p>\n<p>Embora a representa\u00e7\u00e3o interna dos dados bin\u00e1rios seja muito diferente entre os dois, voc\u00ea pode continuar a armazenar no Couchbase Server os dados bin\u00e1rios que vinha armazenando no MongoDB.<\/p>\n<p>A principal diferen\u00e7a \u00e9 que o Couchbase Server pode armazenar bin\u00e1rios de at\u00e9 20 MB, enquanto o MongoDB oferece uma camada de conveni\u00eancia para dividir arquivos muito grandes em v\u00e1rios documentos.<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/large-objects-in-a-database\/\">H\u00e1 fortes argumentos contra o armazenamento de bin\u00e1rios grandes em seu banco de dados<\/a>. Quando voc\u00ea tem muitos bin\u00e1rios muito grandes, pode considerar o uso de um servi\u00e7o de armazenamento de objetos dedicado para armazen\u00e1-los e usar o Couchbase para manter os metadados desses bin\u00e1rios.<\/p>\n<h2 id=\"architecture\">Arquitetura<\/h2>\n<h3 id=\"sharding\">Fragmenta\u00e7\u00e3o<\/h3>\n<p>O Couchbase Server fragmenta os dados e dimensiona horizontalmente, distribuindo automaticamente um espa\u00e7o de hash entre os n\u00f3s em um cluster.<\/p>\n<p>Em seguida, ele usa a chave de seu documento para decidir em que parte do espa\u00e7o de hash - e, portanto, em que n\u00f3 do cluster - esse documento reside. Como desenvolvedor, isso \u00e9 abstra\u00eddo para voc\u00ea pelo SDK do cliente.<\/p>\n<p>Com o MongoDB, voc\u00ea precisa escolher um m\u00e9todo de fragmenta\u00e7\u00e3o e uma chave de fragmenta\u00e7\u00e3o. A chave de fragmento \u00e9 um campo indexado dentro de seu documento que determina onde o documento reside no cluster.<\/p>\n<p>A principal diferen\u00e7a aqui \u00e9 que o Couchbase Server lida automaticamente com toda a fragmenta\u00e7\u00e3o para voc\u00ea, enquanto o MongoDB lhe d\u00e1 a op\u00e7\u00e3o de escolher o m\u00e9todo de fragmenta\u00e7\u00e3o e a chave de fragmenta\u00e7\u00e3o. Se os seus aplicativos dependerem de uma distribui\u00e7\u00e3o espec\u00edfica de dados no cluster, ser\u00e1 necess\u00e1rio ajust\u00e1-los para permitir a distribui\u00e7\u00e3o baseada em hash usada pelo Couchbase.<\/p>\n<p>O sharding baseado em hash simplifica muito o dimensionamento em compara\u00e7\u00e3o com o MongoDB. Como desenvolvedor, isso pode parecer mais um problema para a sua equipe de opera\u00e7\u00f5es. No entanto, isso significa que \u00e9 mais f\u00e1cil contar com o Couchbase Server caso o uso do seu software cres\u00e7a.<\/p>\n<h3 id=\"replication\">Replica\u00e7\u00e3o e consist\u00eancia<\/h3>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/moving-from-mongodb-to-couchbase-server\/cb-three-nodes-sm.png\" alt=\"Three Couchbase Server nodes\" align=\"right\" \/>O Couchbase Server mant\u00e9m uma \u00fanica c\u00f3pia ativa de cada documento e, em seguida, at\u00e9 duas r\u00e9plicas; voc\u00ea pode configurar o n\u00famero de r\u00e9plicas em um bucket ou por opera\u00e7\u00e3o.<\/p>\n<p>Isso significa que, durante a opera\u00e7\u00e3o normal, voc\u00ea lida com a mesma c\u00f3pia ativa sempre que escreve ou l\u00ea um documento. Como resultado, voc\u00ea n\u00e3o precisa lidar com vers\u00f5es conflitantes de documentos. As r\u00e9plicas entram em a\u00e7\u00e3o somente quando a c\u00f3pia ativa n\u00e3o est\u00e1 dispon\u00edvel.<\/p>\n<p>Como desenvolvedor, a distribui\u00e7\u00e3o e a replica\u00e7\u00e3o de documentos s\u00e3o abstra\u00eddas para voc\u00ea. Voc\u00ea escreve, l\u00ea e consulta usando sua conex\u00e3o com o bucket, e o SDK cuida exatamente de onde esses dados est\u00e3o armazenados. N\u00e3o h\u00e1 necessidade de levar em conta conjuntos de r\u00e9plicas ou esquemas de sharding.<\/p>\n<p>Se voc\u00ea conhece o <a href=\"https:\/\/en.wikipedia.org\/wiki\/CAP_theorem\">Teorema CAP<\/a> ent\u00e3o voc\u00ea tamb\u00e9m sabe que favorecer a consist\u00eancia tem um efeito sobre a disponibilidade. No caso de falha de um n\u00f3, seus documentos ativos ficar\u00e3o indispon\u00edveis por um curto per\u00edodo de tempo para permitir que o cluster promova as r\u00e9plicas apropriadas ao status ativo. Em seu c\u00f3digo, tudo o que voc\u00ea precisa fazer \u00e9 tentar novamente uma opera\u00e7\u00e3o que falhou.<\/p>\n<h3 id=\"indexing\">Indexa\u00e7\u00e3o<\/h3>\n<p>O Couchbase Server oferece dois tipos amplos de \u00edndice:<\/p>\n<ul>\n<li>GSI: \u00edndices secund\u00e1rios globais<\/li>\n<li>visualiza\u00e7\u00f5es: geradas por consultas de redu\u00e7\u00e3o de mapas.<\/li>\n<\/ul>\n<p>A diferen\u00e7a \u00e9 mais do que um detalhe de implementa\u00e7\u00e3o, pois voc\u00ea cria e gerencia os dois tipos de \u00edndice de forma diferente. Em geral, voc\u00ea usar\u00e1 os \u00edndices GSI para replicar os \u00edndices do MongoDB.<\/p>\n<table>\n<thead>\n<tr class=\"header\">\n<th style=\"text-align: center\"><strong>MongoDB<\/strong><\/th>\n<th style=\"text-align: center\"><strong>Servidor Couchbase<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td style=\"text-align: center\">Campo \u00fanico<\/td>\n<td style=\"text-align: center\">GSI<\/td>\n<\/tr>\n<tr class=\"even\">\n<td style=\"text-align: center\">\u00cdndice composto<\/td>\n<td style=\"text-align: center\">GSI<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td style=\"text-align: center\">\u00cdndice de v\u00e1rias chaves<\/td>\n<td style=\"text-align: center\">GSI<\/td>\n<\/tr>\n<tr class=\"even\">\n<td style=\"text-align: center\">\u00cdndice geoespacial<\/td>\n<td style=\"text-align: center\">\u00cdndice espacial em visualiza\u00e7\u00f5es<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td style=\"text-align: center\">\u00cdndice de texto<\/td>\n<td style=\"text-align: center\">Pesquisa de texto livre do Couchbase na pr\u00f3xima vers\u00e3o do Couchbase Server<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"node-types\">Tipos de n\u00f3s<\/h3>\n<p>Quando voc\u00ea ultrapassa o limite de um servidor MongoDB, \u00e9 necess\u00e1rio introduzir processos de roteador e servidores de configura\u00e7\u00e3o.<\/p>\n<p>Com o Couchbase Server, essas duas fun\u00e7\u00f5es s\u00e3o encontradas no SDK do cliente. Quando voc\u00ea se conecta ao cluster a partir do seu aplicativo, o SDK recebe um mapa de onde cada fragmento est\u00e1 localizado no cluster. O Couchbase Server atualiza automaticamente o mapa do cluster sempre que a forma do cluster muda. Cada solicita\u00e7\u00e3o acontece diretamente do servidor do aplicativo para o n\u00f3 relevante do Couchbase.<\/p>\n<p>Quando o cluster crescer, voc\u00ea poder\u00e1 optar por executar n\u00f3s especializados em dados, consultas e indexa\u00e7\u00e3o. <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/concepts\/multidimensional-scaling.html\">Leia mais sobre escalonamento multidimensional<\/a>.<\/p>\n<p>Tudo isso acontece de forma transparente para voc\u00ea, como desenvolvedor.<\/p>\n<h3 id=\"buckets-and-collections\">Baldes e cole\u00e7\u00f5es<\/h3>\n<p>Tanto o Couchbase Server quanto o MongoDB permitem que voc\u00ea divida seu conjunto de dados em grupos de documentos: O Couchbase tem buckets e o MongoDB tem cole\u00e7\u00f5es.<\/p>\n<p>Enquanto as cole\u00e7\u00f5es do MongoDB t\u00eam um escopo equivalente ao das tabelas relacionais, os buckets do Couchbase Server talvez sejam mais equivalentes a um banco de dados relacional.<\/p>\n<p>Essa distin\u00e7\u00e3o \u00e9 importante porque, normalmente, voc\u00ea n\u00e3o quer mais do que dez buckets em um \u00fanico cluster do Couchbase. Isso os torna, de certa forma, inadequados como namespaces e, em vez disso, eles servem como uma maneira de compartilhar decis\u00f5es de configura\u00e7\u00e3o entre tipos semelhantes de documentos.<\/p>\n<p>Isso tem duas consequ\u00eancias principais:<\/p>\n<ul>\n<li>voc\u00ea precisa de outra maneira de atribuir nomes aos seus documentos<\/li>\n<li>voc\u00ea precisa pensar sobre quando \u00e9 apropriado criar um novo bucket.<\/li>\n<\/ul>\n<h4 id=\"when-to-use-multiple-buckets\">Quando usar v\u00e1rios buckets<\/h4>\n<p>Primeiro, precisamos pensar em como voc\u00ea pode alocar recursos para os buckets. As duas grandes considera\u00e7\u00f5es s\u00e3o:<\/p>\n<ul>\n<li>RAM<\/li>\n<li>visualiza\u00e7\u00f5es e \u00edndices.<\/li>\n<\/ul>\n<p>Ao criar um bucket, voc\u00ea aloca a ele uma parte da RAM de cada m\u00e1quina. A RAM que voc\u00ea atribui a um bucket deve ser grande o suficiente para armazenar o conjunto de trabalho desses dados mais os poucos bytes de metadados associados a cada documento.<\/p>\n<p>Isso significa que voc\u00ea pode alocar diferentes quantidades de RAM adequadamente para diferentes conjuntos de dados com base em como voc\u00ea os acessa.<\/p>\n<p>Da mesma forma, as exibi\u00e7\u00f5es e os \u00edndices do Couchbase s\u00e3o executados nos documentos dentro de um bucket, da mesma forma que uma consulta de redu\u00e7\u00e3o de mapa do MongoDB \u00e9 executada em uma \u00fanica cole\u00e7\u00e3o.<\/p>\n<p>Se voc\u00ea tiver alguns documentos que n\u00e3o precisam de indexa\u00e7\u00e3o, porque voc\u00ea s\u00f3 os acessa por meio da chave deles, e tiver alguns grupos de documentos com velocidades diferentes, ser\u00e1 prudente nunca executar indexadores no primeiro conjunto de dados e executar os indexadores com intervalos apropriados no restante.<\/p>\n<p>Dividir nossos dados em diferentes compartimentos nos permite fazer bom uso da RAM e do tempo de CPU necess\u00e1rio para os indexadores.<\/p>\n<p>Vejamos o exemplo de um aplicativo de com\u00e9rcio eletr\u00f4nico, os dados que voc\u00ea armazenaria, seu perfil e como voc\u00ea responde a isso na configura\u00e7\u00e3o do seu bucket.<\/p>\n<table>\n<thead>\n<tr class=\"header\">\n<th><strong>Tipo de dados<\/strong><\/th>\n<th><strong>Perfil de dados<\/strong><\/th>\n<th><strong>Perfil da ca\u00e7amba<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td>Sess\u00f5es<\/td>\n<td>Respostas r\u00e1pidas, acesso a valores-chave, sess\u00f5es simult\u00e2neas previs\u00edveis<\/td>\n<td>RAM para atender ao n\u00famero t\u00edpico de sess\u00f5es ao vivo, sem indexa\u00e7\u00e3o<\/td>\n<\/tr>\n<tr class=\"even\">\n<td>Perfis de usu\u00e1rio<\/td>\n<td>Respostas r\u00e1pidas enquanto os usu\u00e1rios est\u00e3o ativos, os dados mudam lentamente<\/td>\n<td>RAM para atender aos perfis de usu\u00e1rio para o n\u00famero t\u00edpico de sess\u00f5es ao vivo, indexa\u00e7\u00e3o em<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td>Dados do pedido<\/td>\n<td>Leitura intensa ap\u00f3s a cria\u00e7\u00e3o inicial, vida \u00fatil curta<\/td>\n<td>RAM para atender a pedidos de um n\u00famero t\u00edpico de sess\u00f5es ao vivo, indexa\u00e7\u00e3o em<\/td>\n<\/tr>\n<tr class=\"even\">\n<td>Dados do produto<\/td>\n<td>Necessidade de respostas r\u00e1pidas, leitura pesada<\/td>\n<td>RAM para caber todo o cat\u00e1logo, indexa\u00e7\u00e3o em<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00c9 um pouco mais complicado do que decidir se a indexa\u00e7\u00e3o est\u00e1 ativada ou desativada. Em vez disso, voc\u00ea escolhe os tipos de \u00edndice e a velocidade das atualiza\u00e7\u00f5es decide a frequ\u00eancia de execu\u00e7\u00e3o dos indexadores. A combina\u00e7\u00e3o de dados de movimenta\u00e7\u00e3o lenta e r\u00e1pida pode ser ineficiente, pois os indexadores de um bucket s\u00e3o executados em todos os documentos desse bucket, inclusive os que n\u00e3o foram alterados.<\/p>\n<h4 id=\"namespacing-documents\">Namespacing de documentos<\/h4>\n<p>Se n\u00e3o pudermos usar os compartimentos como namespaces, como poderemos distinguir facilmente os diferentes tipos de documentos?<\/p>\n<p>Voc\u00ea deve usar uma combina\u00e7\u00e3o de:<\/p>\n<ul>\n<li>Nomea\u00e7\u00e3o de chaves<\/li>\n<li>usando um \"tipo\" em seu documento JSON.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/data-modelling-key-design\/\">Uso de prefixos e sufixos sem\u00e2nticos em seus nomes de chaves<\/a> \u00e9 uma maneira f\u00e1cil de atribuir nomes aos seus documentos, especialmente quando voc\u00ea estiver usando o Couchbase para valores-chave.<\/p>\n<p>A exig\u00eancia de um tipo em seus esquemas de documentos fornece os dados necess\u00e1rios para criar consultas que se aplicam somente a determinados tipos de documentos.<\/p>\n<h2 id=\"programming-model\">Modelo de programa\u00e7\u00e3o<\/h2>\n<p>H\u00e1 tr\u00eas maneiras de trabalhar com o Couchbase Server:<\/p>\n<ul>\n<li>acesso simples a valores-chave: consist\u00eancia forte, respostas em menos de um milissegundo<\/li>\n<li>visualiza\u00e7\u00f5es: geradas por consultas de redu\u00e7\u00e3o de mapas<\/li>\n<li>N1QL: Consultas semelhantes a SQL com JOINs.<\/li>\n<\/ul>\n<p>Vindo do MongoDB, voc\u00ea pode se sentir tentado a traduzir todas as suas consultas do MongoDB para o N1QL. No entanto, vale a pena pensar sobre os m\u00e9ritos relativos de cada um e, em seguida, usar a combina\u00e7\u00e3o que atenda \u00e0s suas necessidades.<\/p>\n<p>Voc\u00ea pode ir muito longe com o acesso a valores-chave, por exemplo, usando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/manual-secondary-indexes\/\">\u00edndices secund\u00e1rios manuais<\/a>.<\/p>\n<h3 id=\"query\">Consulta<\/h3>\n<p>Para consultas ad-hoc, o Couchbase Server oferece o N1QL. O N1QL \u00e9 uma linguagem semelhante ao SQL e, portanto, \u00e9 bem diferente da consulta do MongoDB.<\/p>\n<p>Vejamos um exemplo em que retornamos o nome dos funcion\u00e1rios do escrit\u00f3rio de Londres que trabalharam l\u00e1 por dois anos ou mais, ordenados por data de in\u00edcio:<\/p>\n<pre><code>SELECT name FROM `hr`\r\nWHERE office='London' AND\r\ntype='employee' AND\r\nDATE_DIFF_MILLIS(startDate, NOW_MILLIS) &gt;= 63113904000 ORDER BY startDate;<\/code><\/pre>\n<p>Como voc\u00ea pode ver, o N1QL \u00e9 muito familiar se voc\u00ea j\u00e1 trabalhou com SQL. Voc\u00ea poder\u00e1 traduzir suas consultas do MongoDB para o N1QL com relativamente pouco esfor\u00e7o.<\/p>\n<p>Antes de come\u00e7ar a reescrever suas consultas, voc\u00ea deve considerar uma grande vantagem que o N1QL oferece: \u00e9 poss\u00edvel executar JOINs entre documentos. Vamos usar nossa consulta acima e tamb\u00e9m retornar o nome do gerente de cada pessoa.<\/p>\n<pre><code>SELECT r.name, s.name AS manager FROM `hr` r\r\nJOIN `hr` s\r\nON KEYS r.manager\r\nWHERE r.office='London' AND\r\nr.type='employee' AND\r\nDATE_DIFF_MILLIS(r.startDate, NOW_MILLIS) &gt;= 63113904000 ORDER BY r.startDate;<\/code><\/pre>\n<p><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/developer-guide\/querying.html\">Leia mais sobre N1QL<\/a> e <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/developer-guide\/views-intro.html\">sobre visualiza\u00e7\u00f5es<\/a>.<\/p>\n<h3 id=\"concurrency\">Concorr\u00eancia<\/h3>\n<p>No Couchbase Server, o bloqueio sempre ocorre no n\u00edvel do documento e h\u00e1 dois tipos:<\/p>\n<ul>\n<li>pessimista: nenhum outro ator pode escrever nesse documento at\u00e9 que ele seja liberado ou que o tempo limite seja atingido<\/li>\n<li>otimista: use os valores CAS para verificar se o documento foi alterado desde a \u00faltima vez que voc\u00ea o tocou e aja de acordo.<\/li>\n<\/ul>\n<p>Em um banco de dados distribu\u00eddo, o bloqueio otimista \u00e9 uma abordagem muito mais pr\u00f3xima. <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/optimistic-or-pessimistic-locking-which-one-should-you-pick\/\">Leia mais sobre como escolher o tipo certo de trava<\/a>.<\/p>\n<h3 id=\"libraries\">Bibliotecas e integra\u00e7\u00f5es<\/h3>\n<p>Existem <a href=\"https:\/\/developer.couchbase.com\/open-source-projects\">SDKs com suporte oficial<\/a> para todas as principais linguagens, incluindo Java, .NET, NodeJS, Python, Go, Ruby e C. Voc\u00ea tamb\u00e9m encontrar\u00e1 bibliotecas de clientes desenvolvidas pela comunidade para linguagens como Erlang.<\/p>\n<p>Da mesma forma, h\u00e1 integra\u00e7\u00f5es oficiais com <a href=\"https:\/\/projects.spring.io\/spring-data-couchbase\/\">Dados do Spring<\/a>, Spark, Hadoop, Elasticsearch, .<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/linq-n1ql-and-couchbase-oh-mai-linq2couchbase-ga\/\">NET's Linq<\/a> e h\u00e1 um <a href=\"https:\/\/www.npmjs.com\/package\/ottoman\">NodeJS ODM chamado Ottoman<\/a>.<\/p>\n<h2 id=\"conclusion\">Conclus\u00e3o<\/h2>\n<p>A mudan\u00e7a de um armazenamento de documentos para outro \u00e9 relativamente simples, pois a forma geral dos seus dados n\u00e3o precisa mudar muito.<\/p>\n<p>Como desenvolvedor que est\u00e1 fazendo a portabilidade de um aplicativo do MongoDB para o Couchbase Server, suas principais considera\u00e7\u00f5es s\u00e3o que voc\u00ea precisa:<\/p>\n<ul>\n<li>substituir o espa\u00e7amento de nomes de cole\u00e7\u00f5es por nomes de chaves e tipos de documentos<\/li>\n<li>simplificar suas consultas usando N1QL JOINs<\/li>\n<li>considere onde o acesso a valores-chave pode ser a melhor op\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Se voc\u00ea est\u00e1 mudando do MongoDB para o Couchbase Server, certamente n\u00e3o \u00e9 o primeiro. Essa \u00e9 uma \u00f3tima not\u00edcia para voc\u00ea, pois encontrar\u00e1 pessoas que j\u00e1 fizeram a mudan\u00e7a antes em nosso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">f\u00f3runs<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Moving from MongoDB to Couchbase server This is a developer-focused guide to moving your application&#8217;s data store from MongoDB to Couchbase Server, following on from Laurent&#8217;s guide to making the move from PostgreSQL. While it doesn&#8217;t cover every corner-case, it [&hellip;]<\/p>","protected":false},"author":18,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815],"tags":[],"ppma_author":[8982],"class_list":["post-2165","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Moving from MongoDB to Couchbase Server - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-mongodb-to-couchbase-server\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving from MongoDB to Couchbase Server\" \/>\n<meta property=\"og:description\" content=\"Moving from MongoDB to Couchbase server This is a developer-focused guide to moving your application&#8217;s data store from MongoDB to Couchbase Server, following on from Laurent&#8217;s guide to making the move from PostgreSQL. While it doesn&#8217;t cover every corner-case, it [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-mongodb-to-couchbase-server\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-02-19T09:57:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T08:12:39+00:00\" \/>\n<meta name=\"author\" content=\"Matthew Revell, Lead Developer Advocate, EMEA, 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=\"Matthew Revell, Lead Developer Advocate, EMEA, 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\/moving-from-mongodb-to-couchbase-server\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/\"},\"author\":{\"name\":\"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/6c3060a94353df62a71d4672b3454555\"},\"headline\":\"Moving from MongoDB to Couchbase Server\",\"datePublished\":\"2016-02-19T09:57:33+00:00\",\"dateModified\":\"2024-09-12T08:12:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/\"},\"wordCount\":2042,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Best Practices and Tutorials\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/\",\"name\":\"Moving from MongoDB to Couchbase Server - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-02-19T09:57:33+00:00\",\"dateModified\":\"2024-09-12T08:12:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#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\/moving-from-mongodb-to-couchbase-server\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving from MongoDB to Couchbase Server\"}]},{\"@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\/6c3060a94353df62a71d4672b3454555\",\"name\":\"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b1bc555cd9166b46d6063003c3b92317\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b38ea45b78371f0008a765ea828bfed91aa97c25981ebf214226402a510b39b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b38ea45b78371f0008a765ea828bfed91aa97c25981ebf214226402a510b39b?s=96&d=mm&r=g\",\"caption\":\"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase\"},\"description\":\"Matthew Revell is a Lead Dev Advocate, EMEA Couchbase. He developed a global strategy for putting Couchbase front in the minds of the product's developers.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-revell\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mudan\u00e7a do MongoDB para o Couchbase Server - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-mongodb-to-couchbase-server\/","og_locale":"pt_BR","og_type":"article","og_title":"Moving from MongoDB to Couchbase Server","og_description":"Moving from MongoDB to Couchbase server This is a developer-focused guide to moving your application&#8217;s data store from MongoDB to Couchbase Server, following on from Laurent&#8217;s guide to making the move from PostgreSQL. While it doesn&#8217;t cover every corner-case, it [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-mongodb-to-couchbase-server\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-02-19T09:57:33+00:00","article_modified_time":"2024-09-12T08:12:39+00:00","author":"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/"},"author":{"name":"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/6c3060a94353df62a71d4672b3454555"},"headline":"Moving from MongoDB to Couchbase Server","datePublished":"2016-02-19T09:57:33+00:00","dateModified":"2024-09-12T08:12:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/"},"wordCount":2042,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Best Practices and Tutorials"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/","url":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/","name":"Mudan\u00e7a do MongoDB para o Couchbase Server - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-02-19T09:57:33+00:00","dateModified":"2024-09-12T08:12:39+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/moving-from-mongodb-to-couchbase-server\/#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\/moving-from-mongodb-to-couchbase-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Moving from MongoDB to Couchbase Server"}]},{"@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\/6c3060a94353df62a71d4672b3454555","name":"Matthew Revell, l\u00edder de suporte ao desenvolvedor, EMEA, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/b1bc555cd9166b46d6063003c3b92317","url":"https:\/\/secure.gravatar.com\/avatar\/3b38ea45b78371f0008a765ea828bfed91aa97c25981ebf214226402a510b39b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b38ea45b78371f0008a765ea828bfed91aa97c25981ebf214226402a510b39b?s=96&d=mm&r=g","caption":"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase"},"description":"Matthew Revell \u00e9 um dos principais defensores do desenvolvimento do Couchbase na regi\u00e3o EMEA. Ele desenvolveu uma estrat\u00e9gia global para colocar o Couchbase na mente dos desenvolvedores do produto.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-revell\/"}]}},"authors":[{"term_id":8982,"user_id":18,"is_guest":0,"slug":"matthew-revell","display_name":"Matthew Revell, Lead Developer Advocate, EMEA, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3b38ea45b78371f0008a765ea828bfed91aa97c25981ebf214226402a510b39b?s=96&d=mm&r=g","author_category":"","last_name":"Revell","first_name":"Matthew","job_title":"","user_url":"","description":"Matthew Revell \u00e9 um dos principais defensores do desenvolvimento do Couchbase na regi\u00e3o EMEA. Ele desenvolveu uma estrat\u00e9gia global para colocar o Couchbase na mente dos desenvolvedores do produto."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2165","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\/18"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2165"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2165\/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=2165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2165"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}