Baixe o app para aproveitar ainda mais
Prévia do material em texto
Brasília-DF. Banco de dados nosql com mongodB Elaboração Leandro Cavalcanti de Santana Produção Equipe Técnica de Avaliação, Revisão Linguística e Editoração Sumário APrESEntAção ................................................................................................................................. 4 orgAnizAção do CAdErno dE EStudoS E PESquiSA .................................................................... 5 introdução.................................................................................................................................... 7 unidAdE i Fundamentos do mongodB ............................................................................................................ 9 CAPítulo 1 examinando a FilosoFia do mongodB ............................................................................. 9 CAPítulo 2 entendendo as partes do mongodB ............................................................................... 16 CAPítulo 3 examinando a lista de recursos ...................................................................................... 20 unidAdE ii Fazendo a instalação do mongodB ............................................................................................ 28 CAPítulo 1 Qual sistema usar? ............................................................................................................. 28 CAPítulo 2 mongodB em execução ................................................................................................... 32 CAPítulo 3 suporte de drivers ............................................................................................................. 35 unidAdE iii modelagem do mongodB ............................................................................................................. 40 CAPítulo 1 como modelar? ................................................................................................................ 40 CAPítulo 2 momento integração ....................................................................................................... 49 CAPítulo 3 e o Que esperar do mongodB? Fazendo um overview! ................................................ 61 unidAdE iV atividade prática .............................................................................................................................. 65 CAPítulo 1 vamos Que vamos! ............................................................................................................. 65 CAPítulo 2 gridFs! ................................................................................................................................. 79 rEfErênCiAS .................................................................................................................................. 85 5 Apresentação Caro aluno A proposta editorial deste Caderno de Estudos e Pesquisa reúne elementos que se entendem necessários para o desenvolvimento do estudo com segurança e qualidade. Caracteriza-se pela atualidade, dinâmica e pertinência de seu conteúdo, bem como pela interatividade e modernidade de sua estrutura formal, adequadas à metodologia da Educação a Distância – EaD. Pretende-se, com este material, levá-lo à reflexão e à compreensão da pluralidade dos conhecimentos a serem oferecidos, possibilitando-lhe ampliar conceitos específicos da área e atuar de forma competente e conscienciosa, como convém ao profissional que busca a formação continuada para vencer os desafios que a evolução científico-tecnológica impõe ao mundo contemporâneo. Elaborou-se a presente publicação com a intenção de torná-la subsídio valioso, de modo a facilitar sua caminhada na trajetória a ser percorrida tanto na vida pessoal quanto na profissional. Utilize-a como instrumento para seu sucesso na carreira. Conselho Editorial 6 organização do Caderno de Estudos e Pesquisa Para facilitar seu estudo, os conteúdos são organizados em unidades, subdivididas em capítulos, de forma didática, objetiva e coerente. Eles serão abordados por meio de textos básicos, com questões para reflexão, entre outros recursos editoriais que visam tornar sua leitura mais agradável. Ao final, serão indicadas, também, fontes de consulta para aprofundar seus estudos com leituras e pesquisas complementares. A seguir, apresentamos uma breve descrição dos ícones utilizados na organização dos Cadernos de Estudos e Pesquisa. Provocação Textos que buscam instigar o aluno a refletir sobre determinado assunto antes mesmo de iniciar sua leitura ou após algum trecho pertinente para o autor conteudista. Para refletir Questões inseridas no decorrer do estudo a fim de que o aluno faça uma pausa e reflita sobre o conteúdo estudado ou temas que o ajudem em seu raciocínio. É importante que ele verifique seus conhecimentos, suas experiências e seus sentimentos. As reflexões são o ponto de partida para a construção de suas conclusões. Sugestão de estudo complementar Sugestões de leituras adicionais, filmes e sites para aprofundamento do estudo, discussões em fóruns ou encontros presenciais quando for o caso. Atenção Chamadas para alertar detalhes/tópicos importantes que contribuam para a síntese/conclusão do assunto abordado. 7 Saiba mais Informações complementares para elucidar a construção das sínteses/conclusões sobre o assunto abordado. Sintetizando Trecho que busca resumir informações relevantes do conteúdo, facilitando o entendimento pelo aluno sobre trechos mais complexos. Para (não) finalizar Texto integrador, ao final do módulo, que motiva o aluno a continuar a aprendizagem ou estimula ponderações complementares sobre o módulo estudado. 8 introdução Neste material de apoio você irá encontrar de forma simples e prática o assunto da disciplina de Banco de Dados NoSQL com MongoDB. O conteúdo foi produzido e organizado por Leandro Cavalcanti, que possui graduação em Sistemas de Informação pela Universidade Federal Rural de Pernambuco e mestrado em Engenharia da Computação pela Universidade de Pernambuco. O material divide-se em: Unidade 1, faz uma abordagem aos conceitos de fundamentos do MongoDB. Unidade 2, são apresentados os modelos e métodos de instalação e configuração do MongoDB. A Unidade 3 é voltada para modelagem do Banco de Dados e expectativas da tecnologia. Por fim, a Unidade 4 é proposta uma atividade prática. É possível encontrar um material complementar em: <https://www.devmedia.com. br/introducao-ao-mongodb/30792>. objetivos » Apresentar os conceitos e fundamentos do MongoDB. » Conhecer os drivers de instalação. » Analisar os processos de instalação e suas instâncias. » Entender a modelagem do banco de dados. » Desenvolver uma atividade prática. 9 unidAdE ifundAmEntoS do mongodB CAPítulo 1 Examinando a filosofia do mongodB Há décadas, os bancos de dados relacionais tradicionais (SQL) servem para armazenar qualquer tipo de dados, por exemplo: Oracle, PostgreSQL, MySQL, SQLite, MS SQL Server. A proposta da equipe do MongoDB é: não criar um BD que tente resolver tudo e todos os problemas. Ao invés disso, precisávamos criar um BD que funcionasse com documentos em vez de linhas, que fosse muito rápido, escalável e fácil de usar. Para que isso aconteça, é necessário descartar alguns recursos, o que significa que esta solução não se encaixa em todos os aspectos. Por exemplo, o fato de não existir suporte às transações significa que o MongoDB não deve ser usado para o desenvolvimento de um aplicativo contábil. O MongoDB é bom para ser aproveitado em uma parte do aplicativo mencionado (para armazenar dados complexos). No entanto, isso não é um problema, uma vez que não há motivo para não usar um RDBMS (Relational DataBase Management System) tradicional para componentes contábeis e MongoDB para arquivamento de documentos. Soluções híbridas como estas são bastante comuns e você pode vê-las em aplicativos que funcionam em ambientesde produção, por exemplo, no site do New York Times (NYT). Uma vez que você esteja familiarizado com a ideia de que o MongoDB não pode resolver todos os seus problemas, você achará que, para alguns deles, o MongoDB é exato, com todas as conexões e as análises de dados na web (como exemplo, imagine o Analytics da Google, on-line, ou seja, em tempo real para o seu site) e com o uso da arquitetura e estruturas de dados complexos (postagens de blog e comentários, por exemplo). Um conceito que coloca muita atenção no MongoDB está no fato de que ele sempre desenvolve mais de uma cópia do banco de dados. Em caso de falha, o banco de dados pode ser restaurado a partir dos servidores. Dada a proposta de ser o mais rápido 10 UNIDADE I │ FUNDAmENtos Do moNgoDB possível, o MongoDB usa alguns atalhos que dificultam a recuperação quando ocorre um bloqueio. Lembre-se de que o MongoDB não é um servidor ideal para qualquer coisa. No entanto, para cumprir uma variedade de propósitos, pode ser uma ferramenta incrível para implementar uma solução. O site MongoDB contém downloads para Linux, Mac OS, Windows e Solaris. Não é necessário se preocupar em imprimir seus dados para colocá-los em uma tabela, basta coletá-los e enviá-los para o MongoDB para manipulá-lo. Em seguida, vamos a um exemplo do mundo real. Em uma determinada ação, pretendemos salvar um conjunto de resultados de pesquisa do eBay. Pode haver qualquer resultado (até cem) e foi necessário pensar uma maneira fácil de associar esses resultados aos usuários do seu banco de dados. Se estivesse usando MySQL, os passos que iríamos seguir seriam: 1. criar uma tabela para guardar os dados; 2. desenvolver o código para guardar seus resultados e, posteriormente, implementar outros códigos, adicionar e compilar tudo novamente. Nesse exemplo, de aplicação comum sendo normal os desenvolvedores se depararem com ele. No geral, simplesmente seguimos em frente para decidir a problemática. Mas, fazendo o uso do MongoDB o resultado foi satisfatório e ocorreu com apenas algumas diferenças se tratando de linhas de códigos. Especificamente, foi adicionada a linha de código a seguir: » request[‘ebay_results’] = ebay_results_array » collection.save(request) Acima no exemplo, o request é o documento, ebay_results é a chave e ebay_result_ array contém os resultados do eBay. A segunda linha quer dizer que salva as alterações. Um detalhe é que, no momento em que esse documento for acessado futuramente, terá os resultados do eBay da mesma forma do formato anterior. E pasmem! Não foi preciso fazer o uso de nenhum SQL. Sequer foi necessário fazer nenhuma conversão, nem criar tabela nova ou implementar código “extraterrestre” – o MongoDB simplesmente pegou. 11 Fundamentos do mongodB │ unIdade I Ausência de suporte inato a transações Os desenvolvedores do MongoDB tomaram uma decisão importante: o banco de dados não inclui a semântica para os negócios (o elemento que oferece garantias sobre a coerência e o armazenamento de informações). Esta é uma compensação sólida com base no alvo do MongoDB ser simples, rápido e escalável. Depois que esses recursos pesados são deixados de lado, é mais fácil escalar horizontalmente. Em um RDBMS tradicional, o desempenho do software é baseado nas características do computador: quanto maior e mais poderoso ele for, melhor o rendimento do RDBMS. Esta operação consiste em escalar verticalmente, mas pode levar até certo ponto. Com a escalada horizontal, em vez de ter um computador enorme, terá vários computadores menos potentes. Historicamente, os clusters foram excelentes para os criados como aquele que percebeu a carga oscilante nos lugares, no entanto, os bancos de dados foram sempre um problema devido às limitações de seus projetos internos. Essa ausência de suporte forma uma falta de desempenho do banco de dados. No entanto, muitas pessoas esquecem quais dos tipos de tabelas mais populares no MySQL (MYISAM, que, por acaso, também é o valor padrão) que também não suportam transações. Esse fato não impediu o MySQL de se transformar no banco de dados de código aberto dominador durante muito mais do que uma década. Uma vez que é realizada pela maioria das opções quando desenvolvemos soluções, o uso do MongoDB será uma questão de preferência pessoal e de avaliação se a relação custo-benefício se adaptar ao seu projeto. JSon e mongodB JSON (Java Script Object Note) é mais do que uma excelente maneira de alterar dados. É também a melhor maneira de armazená-los. Um RDBMS é muito estruturado, com várias tabelas que armazenam tudo individualmente. MongoDB, por outro lado, armazena tudo em um documento único. É assim que o JSON neste aspecto oferece uma maneira sofisticada e expressiva de armazenar dados. Além disso, o JSON efetivamente descreve todo o conteúdo de um determinado documento, de modo que não precise especificar previamente a estrutura dele. O JSON é privado de esquemas (schemaless, em outras palavras, não exige um esquema), uma vez que os documentos podem ser atualizados individualmente ou alterados independentemente de qualquer outro. Como bônus, o JSON também oferece excelente desempenho, mantendo todos os dados como uma lista em um só lugar. 12 UNIDADE I │ FUNDAmENtos Do moNgoDB MongoDB, de fato, não usa o JSON para armazenar dados. Em vez disso, ele usa um formato de dados aberto chamado BSON – que é a abreviatura de JSON binário, desenvolvido pela equipe MongoDB. Na maioria das vezes, usar BSON no lugar de JSON não mudará a maneira como você irá trabalhar com seus dados. O BSON torna o MongoDB ainda mais rápido, tornando muito mais fácil processar um computador e realizar pesquisas nos documentos. O BSON também adiciona alguns recursos que não estão disponíveis no padrão JSON, incluindo a capacidade de adicionar tipos para o processamento de dados binários. A especificação JSON original pode ser encontrada na RFC 4627 e foi escrita por Douglas Crockford. O JSON permite que estruturas de dados complexas sejam representadas em um texto de formato simples, legível para humanos, que, em geral, é considerado muito mais fácil de ler do que o XML. Como o XML, o JSON foi projetado como uma maneira de trocar dados entre o cliente da web (por exemplo, o navegador) e os aplicativos da web. Quando se combina com o modo de seleção para o qual o JSON pode descrever objetos, sua simplicidade faz com que ele o torne a opção de formato preferencial na visão dos desenvolvedores. Você pode estar se perguntando: O que está querendo dizer com dados complexos? Historicamente, os dados mudavam por meio do formato CVS (valores separados por vírgulas). O CSV é um formato de texto simples, em que as linhas são separadas por um caractere de quebra de linha e campos com vírgula. Por exemplo, um CSV classificado pode parecer semelhante: » Membrey, Peter, +852 1234 5678 » Thielen, Wouter, +81 1234 5678 Uma pessoa pode observar esses dados e rapidamente perceber quais as informações que ele comunica. Ou talvez não: o número na terceira coluna é um número de telefone ou de um fax? O número de um sinal sonoro pode ser incluído. Para evitar essa ambiguidade, os arquivos CSV geralmente possuem um campo de página de título, no qual a primeira linha define o que contém o arquivo. A seguinte passagem explica um pouco o exemplo anterior: » Lastname, Firstname, Phone Number » Membrey, Peter, +852 1234 5678 » Thielen, Wouter, +81 1234 5678 13 Fundamentos do mongodB │ unIdade I Agora, nós imaginamos que algumas pessoas no arquivo CSV têm mais de um número de telefone. Então, podemos adicionar outro campo para um número de telefone comercial, no entanto, isto será um novo problema se for necessário informar alguns números de telefone comercial. E haverá problemas também se for necessário adicionar alguns endereços de e-mail. A maioria das pessoas tem mais de um, e essas instruções não podem ser definidas em geral de forma clara nouso particular ou profissional. De repente, o CSV começa a mostrar suas limitações. Os arquivos CSV são apenas adequados para armazenar dados simples e não tem valores repetidos. Da mesma forma, não é incomum que alguns arquivos CSV estejam disponíveis, cada um com informações separadas. Esses arquivos então combinam (geralmente em um RDBMS) para criar uma imagem geral. Como exemplo, uma grande empresa de vendas no varejo pode receber dados de vendas sob a forma de arquivos CSV de cada uma de suas lojas no final de cada dia. Esses arquivos devem ser combinados antes que a empresa possa ver sua versão em um determinado dia. Este processo não é exatamente direto e, sem dúvida, o potencial de um erro ocorrer aumentará à medida que a quantidade de arquivos necessários aumenta. Em geral, XML resolve esse problema. O XML é altamente extensível. Ao invés de definir um formato de dados específico, o XML define a forma de especificar um formato de dados. Isso pode ser útil quando for necessário trocar dados complexos e altamente estruturados. No entanto, para uma simples troca de dados, com frequência, isso gerará muito trabalho. Com efeito, esta cena deu origem à frase “XML hell” (XML do Inferno). O JSON permite uma troca de dados interessante. De modo diferente do CVS, ele pode armazenar conteúdo estruturado, porém, diferentemente do XML, o JSON faz o conteúdo ser fácil de entender e simples de usar. Vamos retornar ao exemplo anterior, mas desta vez, usaremos JSON no lugar de CSV: { “firstname”:”Peter”, “lastname”:”Membrey”, “phone_numbers”:[ “+852 1234 5678”, “+44 1234 565 555” ] } 14 UNIDADE I │ FUNDAmENtos Do moNgoDB Nesta versão do exemplo, cada objeto de JSON (ou o documento) contém toda a informação necessária para que se possa entendê-la. Se você observar phone_numbers, verá que contém uma lista de números diferentes. Esta lista pode ser tão longa quanto necessária. Além disso, pode ser mais específica quanto ao tipo do número registrado, como no seguinte exemplo: { “firstname”:”Peter”, “lastname”:”Membrey”, “numbers”:[ { “phone”:”+85212345678” }, { “fax”:”+441234565555” } ] } Esta versão do exemplo contém melhorias em alguns aspectos. Agora podemos ver claramente sobre o que cada informação se trata. O JSON é extremamente expressivo e embora seja geralmente bastante fácil codificá-lo manualmente, o JSON é gerado automaticamente pelo software. Por exemplo, Python inclui um módulo que automaticamente converte objetos de Python para JSON. Apoiado e usado em múltiplas plataformas, o JSON é uma escolha ideal para trocar dados. Ao acrescentar itens como a lista de números de telefone, cria-se o que chamamos de documento embutido (embedded document). Isto acontece sempre quando em um conteúdo complexo é acrescentado, por exemplo, uma lista (ou uma tabela, termo preferido pelo JSON). Por exemplo, o documento “pessoa” pode ter múltiplos documentos “Address” embutidos. Semelhantemente, um documento “Invoice” pode ter múltiplos documentos de “LineItem” integrados. É claro que o documento “Address” construído no documento “pessoa” também pode conter o seu próprio documento construído, incluindo, por exemplo, números de telefone. 15 Fundamentos do mongodB │ unIdade I O MongoDB não é um banco de dados de tamanho único, que possui aqueles formatos que é “bom para tudo”, mas possui um compromisso no que diz respeito aos custos-benefícios, a fim de atender aos objetivos da aplicação. Normalmente, é chamado de design do esquema (schema design). Pode parecer estranho referir-se ao MongoDB como design do esquema quando o MongoDB se considera um banco de dados sem esquemas. o banco de dados em qualquer lugar O MongoDB está desenvolvido na linguagem de programação C++, o que faz com que seja possível executar a aplicação praticamente em qualquer lugar. Atualmente, os binários podem ser baixados do site do MongoDB e estão disponíveis para Linux, Mac OS, Windows e Solaris. Diferente das outras ferramentas, o MongDB pode ser desenvolvido até por você mesmo, é só baixar o código-fonte e fazer seu próprio MongoDB, embora seja recomendável utilizar os binários disponibilizados sempre que for possível. Todos os binários estão disponíveis tanto para versões 32 bits quanto para 64 bits. Os requisitos modestos do MongoDB permitem que ele seja executado em servidores altamente capacitados ou em máquinas virtuais, e até mesmo em aplicações baseadas na nuvem. Ao manter a simplicidade e focar na velocidade e na eficiência, o MongoDB proporciona um desempenho sólido, independentemente do local em que você optar por implantá-lo. 16 CAPítulo 2 Entendendo as partes do mongodB Não há requisitos para se trabalhar incialmente com o MongoDB, ou seja, você não precisa ser um especialista para dar o pontapé inicial. Abaixo vamos entender sobre mais características do MongoDB e termologia padrão dos bancos de dados. gerando ou criando uma chave Um documento representa o storage (armazenamento) do MongoDB. Em um RDBMS, esta unidade é chamada de linha. No entanto, os documentos são muito mais do que linhas, porque eles possuem a capacidade de guardar informações difíceis, como por exemplo: listas, dicionários e até listas de dicionário. Ao contrário de um banco de dados tradicional, em que uma linha é corrigida, um documento no MongoDB pode ser composto de qualquer número de chaves e valores. Em última análise, uma chave é apenas um rótulo; é equivalente ao nome que se daria a uma coluna em um RDBMS. Uma chave é usada para se referir a partes dos dados no documento. Em um banco de dados relacional, sempre haverá uma forma de identificar apenas um registro, caso contrário, será impossível de se referir a uma linha específica. Assim, é necessário incluir um campo que armazene um valor exclusivo (chave primária) ou um conjunto de campos que só podem identificar a linha especificada (chave primária composta). O MongoDB sempre solicita que cada documento tenha um identificador exclusivo, seguindo a mesma lógica e pelo mesmo motivo. Esse identificador no MongoDB é chamado de “_id”. Se você não especificar um valor para este campo, ele gerará um valor exclusivo (único). Mesmo vivendo em um mundo sólido com relação aos bancos de dados RDBMS, não há consenso sobre o uso de uma chave única fornecida pelo banco de dados ou em sua geração. Recentemente, tornou-se mais popular permitir que o banco de dados crie a chave para você. A razão é que as pessoas têm o mau hábito de mudar os números exclusivos criados por eles, como os números das placas de veículos. Por exemplo, a Inglaterra implantou um novo modelo de número de placas de automóveis que é totalmente diferente do sistema antigo. O fato é que o MongoDB pode lidar perfeitamente com esse tipo de mudança. No geral, seguindo este mesmo exemplo, é necessário que você veja com muita atenção se você usou a placa do veículo como a chave primária. 17 Fundamentos do mongodB │ unIdade I Inicialmente, uma grande parte dos desenvolvedores que usavam o MongoDB tinha suas preferências em criar suas próprias chaves únicas, assumindo a responsabilidade de garantir que o número permanecesse único. Hoje em dia, o consenso geral parece indicar o uso do valor do ID padrão que o MongoDB cria para você. No entanto, como no caso do trabalho com bases de dados RDBMS, a abordagem escolhida é principalmente reduzida às preferências pessoais. No geral, é interessante usar um valor fornecido pelo banco de dados porque mostra que temos a certeza que a chave será única e independente de todo o resto. Mas, temos os casos particulares em que as pessoas ainda preferem usar suas chaves. No final, você tem o poder de decidir o que é mais interessante e apropriado para o seu desenvolvimento. Se você tiver certeza de que sua chave será única (e deve permanecer inalterada), você deve se sentir confortável usando isso. Se você não tem certeza da singularidade da sua chave ou não querse preocupar, você pode simplesmente usar a chave padrão fornecida pelo MongoDB. usando chaves e valores Os documentos são compostos de chaves e valores. Vamos dar outra olhada no exemplo discutido anteriormente neste capítulo: { “firstname”:”Peter”, “lastname”:”Membrey”, “phone_numbers”:[ “+852 1234 5678”, “+44 1234 565 555” ] } Chaves e valores sempre são exibidos em pares. De uma maneira diferente de um RDBMS, em que um valor deve ter qualquer campo, apesar de ser o mesmo que NULL (então, até certo ponto, paradoxal, esse valor significa desconhecido), MongoDB não exige que um documento tenha um valor individual. Por exemplo, se você não conhece o número de telefone de uma pessoa em sua lista, basta deixá-lo de fora. Uma analogia popular para este tipo de situação ocorre com o cartão de visita. Se você tiver um número 18 UNIDADE I │ FUNDAmENtos Do moNgoDB de telefone fixo, normalmente será incluído no seu formulário de visita. No entanto, se não tiver um, você não vai escrever “Número de telefone fixo: nenhum”. Ao invés disso, você simplesmente deixará de inserir essa informação. Se a mesma chave/valor não estiver incluída em um documento do MongoDB, assume-se que não existe. implementando coleções As coleções, de certa forma, são semelhantes às tabelas, mas são muito menos rígidas. Uma coleção é muito semelhante a uma caixa com um rótulo. Talvez você tenha uma caixa em casa com um rótulo que diga “DVD”, na qual você deve colocar seus DVDs. Isso faz sentido, mas nada impede que você coloque CDs ou mesmo que conserte esta caixa. Em um RDBMS, as tabelas são estritamente definidas e você pode inserir apenas certos elementos nelas. No MongoDB, uma coleção é simplesmente um conjunto de objetos (itens) semelhantes. Os itens não precisam necessariamente ser semelhantes (o MongoDB é inerentemente flexível). No entanto, depois de conhecer a indexação e começar a ver consultas mais sofisticadas, logo você perceberá os benefícios de colocar itens semelhantes em uma coleção. Embora seja possível misturar diferentes elementos em uma coleção, não há muita necessidade de fazer isso. Se a coleção fosse chamada de mídia, então todos os DVDs, CDs e fitas estariam em um determinado local correto. Afinal, esses elementos têm características comuns, como o nome de um artista, data de lançamento e conteúdo. Em outras palavras, o fato de certos documentos serem armazenados na mesma coleção depende muito da sua aplicação. E quanto ao desempenho, ter diferentes coleções não faz o sistema mais lento do que ter apenas uma. Lembre-se de que MongoDB busca facilitar seus processos, simplificar sua vida, então você tem que fazer o que deve ser melhor. Finalmente, as coleções são criadas efetivamente diante de sua demanda. Especificamente, uma coleção será criada na sua primeira tentativa de salvar um documento que a referenciá-la. Isso significa que é possível criá-las para uma demanda (não é necessário fazê-lo). Uma vez que o MongoDB também permite que você crie índices e execute outros comandos de nível de banco de dados dinamicamente, você pode aproveitar esse comportamento para criar algumas aplicações bastante dinâmicas. Entendendo os bancos de dados Talvez a maneira mais simples de pensar em um banco de dados no MongoDB é imaginá-lo como uma coleção de coleções. Exatamente, coleção de coleções! 19 Fundamentos do mongodB │ unIdade I Os bancos de dados podem ser criados mediante solicitação. Isso significa que é fácil criar um banco de dados para cada cliente - o código da sua aplicação também pode ser feito para você. Isso também pode ser feito com bancos de dados que não são MongoDB. No entanto, criar bancos de dados dessa forma com o MongoDB é um processo bastante natural. Apesar do que foi dito, somente porque você pode criar um banco de dados dessa maneira não significa que você vá ou que você tem que fazê-lo. No entanto, você terá essa habilidade se quiser usá-la. 20 CAPítulo 3 Examinando a lista de recursos Até agora vimos o que é o MongoDB e o que ele pode oferecer, agora iremos conhecer a lista de recursos que ele proporciona. A lista completa pode ser visualizada no próprio site <www.mongodb.com>. Sempre que possível acesse o site porque os desenvolvedores estão em constante atualização, porém os recursos estão bem próximos ao comum. Ultimamente, se tem feito uma grande evolução na parte da interface do MongoDB. A lista de recursos neste capítulo inclui muitas atividades que ocorrem internamente, mas fique tranquilo! Não precisa ter medo e não precisa estar familiarizado com todos os recursos listados para poder usar o MongoDB. usando armazenamento orientado a documentos (BSon) O BSON é um padrão aberto e suas características podem ser encontradas no próprio site <http://bsonspec.org>. Quando a comunidade ouve falar que BSON é um formato binário do JSON eles esperam que ocupe muito menos espaço do que o formato JSON baseado em texto. No entanto, isso não é necessariamente o que realmente acontece, existem várias situações em que o BSON ocupará mais espaço do que o equivalente JSON. E afinal, você deve estar se perguntando: por que BSON deve ser usado? Bom, o CouchDB (outro banco de dados eficiente e orientado a documentos) usa o JSON puro e é razoável perguntar se vale a pena ter o trabalho de converter documentos BSON em JSON e vice-versa. Antes de tudo, em primeiro lugar, nós devemos lembrar que o MongoDB foi criado para ser rápido e não tão eficiente como ter espaço. Isso não significa que o MongoDB desperdiça espaço (não), no entanto, um overhead para arquivar um documento é perfeitamente aceitável se é assim que é mais rápido buscar dados (o que é verdade). Em suma, o BSON é muito mais fácil de transmitir (em outras palavras, para ser analisado e indexado rapidamente). Embora o BSON requeira um pouco mais de espaço do que o JSON, é improvável que este espaço extra seja um problema, já que os discos têm um baixo custo e o MongoDB pode escalar usando vários computadores. A vantagem de custo, neste caso, é bastante razoável: um pouco mais de espaço em disco é trocado para melhorar o desempenho e a indexação da consulta. 21 Fundamentos do mongodB │ unIdade I Ao usar o BSON, a segunda grande vantagem é que é fácil e rápido convertê-lo para um formato de dados nativo de uma linguagem de programação. Se os dados foram armazenados em JSON puro, é necessário realizar uma conversão relativamente alta. Existem drivers MongoDB para um grande número de linguagens de programação (como PHP, Python, Ruby, C ++, C, e C #), e cada um deles funciona de forma muito diferente. Quando usamos um formato binário simples, as estruturas de dados nativas tendem a ser usadas rapidamente para cada idioma, sem necessariamente inicializar o JSON. Isso torna o código mais simples e rápido, de acordo com os objetivos definidos para o MongoDB. O BSON também disponibiliza algumas extensões para o JSON. Por exemplo, permite armazenar dados binários e incorporar um tipo específico de dado. Desta forma, enquanto o BSON pode armazenar qualquer documento JSON, um documento BSON válido não pode ser um JSON válido. Porém, isso não importa, pois cada idioma possui seu próprio driver que converte dados de e para BSON, sem a necessidade de usar JSON como um idioma intermediário. No final das contas, não é muito provável que o BSON seja um fator importante nas instruções de uso do MongoDB. Com todas as ótimas ferramentas, o MongoDB permanecerá em silêncio em um segundo nível e fará o que precisa ser feito. Além de possivelmente usar uma ferramenta gráfica para analisar seus dados, em geral, você trabalhará com seu idioma nativo e deixará o driver se preocupar com a persistência no MongoDB. Suportando queries dinâmicas O apoio do MongoDB para consultas dinâmicas visa que você possa executar uma consulta sem tê-la planejado antecipadamente. É semelhante a ser capaz de executar consultas SQL em um RDBMS. Mas você deveestar se perguntando: Por que isto está listado como um recurso? Certamente pelo fato de que qualquer banco de dados suporta consultas dinâmicas, correto? Nem sempre! Vejamos, o CouchDB (que é considerado o maior “concorrente” do MongoDB) não suporta consultas dinâmicas. Isso ocorre porque o CouchDB apareceu com uma maneira completamente nova de pensar os dados. Um RDBMS tradicional possui dados estáticos e consultas dinâmicas. Isso significa que a estrutura de dados é definida com antecedência: os gráficos devem ser definidos e cada linha deve ser adaptada a essa estrutura. Uma vez que a base de dados conhece antecipadamente a forma como os dados são estruturados, pode-se fazer algumas suposições e otimizações, o que permite que você faça consultas dinâmicas e rápidas. 22 UNIDADE I │ FUNDAmENtos Do moNgoDB O CouchDB modificou este conceito. Sendo um banco de dados orientado para documentos, o CouchDB não possui esquemas, portanto, os dados são dinâmicos. Enquanto isso, a nova ideia, neste caso, é que as consultas sejam estáticas. Em outras palavras, eles devem ser previamente definidos, antes de serem usados. Tudo o que pode parecer não é tão ruim, já que muitas questões podem ser facilmente definidas anteriormente. Por exemplo, um sistema que permite que você procure um livro provavelmente deixará a busca com base no ISBN. No CouchDB, você precisa criar uma referência ou índice que crie uma lista de todos os ISBNs para todos os documentos. À medida que você escreve um ISBN, a consulta será muito rápida, pois você não precisará realmente procurar dados. Sempre que novos dados são adicionados ao sistema, o CouchDB atualizará sua velocidade automaticamente. Tecnicamente, uma consulta pode ser realizada no CouchDB sem a qual é desenvolvido um índice. Neste caso, no entanto, o CouchDB terá que criar a referência ou índice antes de poder seguir com sua consulta. Isso não será um problema se houver apenas uma centena de livros. No entanto, se você armazenar centenas de milhares de livros, o desempenho será reduzido, pois cada consulta irá gerar novamente o índice (e novamente). Por esse motivo, a equipe do CouchDB não recomenda o uso de consultas dinâmicas - em outras palavras, consultas que não foram predefinidas no ambiente de produção. O CouchDB também permite que você crie suas próprias consultas como funções map e reduce. Se isso parecer algo que requer muito esforço, então você estará em boa companhia, o CouchDB tem uma curva de aprendizado, de certa forma, difícil. Para que possamos estar sozinhos com o CouchDB, um programador experiente provavelmente poderá compreendê-lo rapidamente. Para a maioria das pessoas, no entanto, a curva de aprendizado é difícil. indexando seus documentos O MongoDB possui em seu acervo um extenso suporte para indexar seus documentos, um recurso que será muito prático ao lidar com dezenas de milhares de documentos. Sem um índice, o MongoDB terá que examinar cada documento, um por vez, para ver se há algo que você deseja ver. É como se você pedisse um livro para um bibliotecário e assistisse enquanto ele atravessa a biblioteca inteira olhando para todos os livros. Com um sistema de indexação (normalmente as bibliotecas usam o método de classificação decimal de Dewey), o bibliotecário poderá encontrar a área em que o livro é guardado e, rapidamente, poderá determinar se ele está lá. 23 Fundamentos do mongodB │ unIdade I Ao contrário de um livro de biblioteca, todos os documentos no MongoDB são indexados automaticamente usando a chave “_id”. Esta chave é avaliada como caso especial, uma vez que não é deletada Um índice garante que cada valor deve ser único. Uma das vantagens desta chave é que podemos ter certeza de que cada documento será identificado unicamente – algo que um RDBMS não possui essa garantia. Ao criar seus índices, é possível decidir se você deseja que eles garantam a unicidade. Se você deseja criar um único índice, pode informar ao MongoDB que descarte todas as duplicações. Isso pode ou não ser o que você quer, então pense com atenção antes de usar esta opção, pois pode haver metade dos seus dados acidentalmente apagados. Por padrão, um erro voltará atrás se for feita uma tentativa para criar um único índice com uma chave com valores duplicados. Existem várias oportunidades nas quais você pode querer criar um índice que permita duplicação. Por exemplo, se seu aplicativo fizer perguntas ao usuário de acordo com o seu último nome, o último nome faz sentido ser um índice. É claro que não se pode garantir que cada último nome seja único. Em qualquer banco de dados de tamanho razoável, é quase certo que haverá duplicações. Contudo as capacidades de indexação do MongoDB não terminam por aqui. Ele também pode criar índices em documentos embutidos (embedded documents). Por exemplo, se diversas localidades forem armazenadas na chave endereço, você poderá criar um índice com o CEP. Isso significa que será possível recuperar um documento diante de qualquer CEP – e isso poderá ser feito rápido. O MongoDB vai um pouco além ao permitir o uso de índices compostos. Em um índice composto, duas ou mais chaves são necessárias para a criação de um determinado índice. Exemplo: Ao criar um índice que combine as tags “lastname” e “firstname” uma pesquisa pelo nome completo será muito rápida, pois o MongoDB poderá isolar rapidamente o lastname e, em seguida, de maneira igualmente rápida, isolar o firstname. O MongoDB cuida de tudo para você no que diz respeito à indexação. gerando perfis de queries A ferramenta pronta para a geração de perfil (profiling) permite que você veja como o MongoDB descobre quais documentos devem ser retornados. Isso é útil porque, em muitos casos, uma consulta pode ser facilmente aprimorada simplesmente adicionando um índice. Se você tem uma consulta complicada e não tem certeza de por que está funcionando tão devagar, o gerador de perfis de queries do MongoDB poderá oferecer informações extremamente valiosas. 24 UNIDADE I │ FUNDAmENtos Do moNgoDB Atualizando informações in-place Quando uma linha é atualizada de um banco de dados (ou, no caso do MongoDB, um documento), ele possui algumas opções sobre como fazer essa atualização. Muitos bancos de dados optam pela abordagem MVCC (Multi-Version Concurrency Control), que faz com que usuários distintos vejam versões diferentes dos dados. É uma abordagem interessante e útil, por assegurar que os dados não serão parcialmente editados ou ajustados por outro programa durante uma determinada transação. A desvantagem dessa abordagem reside no fato de que o banco de dados terá que verificar várias cópias, ou seja, fazer o controle de tudo isso. Exemplo: o CouchDB oferece um controle bastante robusto das versões, mas isso tem o custo de tornar os dados armazenados na sua totalidade. Por outro lado, tendo em vista que este processo garante que esses sejam armazenados de forma robusta, a complexidade aumenta e o desempenho é reduzido. É aquela velha história, ganho de um lado e perco do outro! O MongoDB, por outro lado, atualiza a informação no local (in-place). Isso significa que o MongoDB pode atualizar os dados no local em que será encontrado. Normalmente, isso significa que você não precisará alocar espaço adicional e que os índices podem permanecer inalterados. Outra vantagem deste método é que o MongoDB executa “lazy writes” (escritas preguiçosas). Ler e escrever na memória é muito rápido, mas escrever em disco é o oposto da velocidade, muito lento. Isso significa que é necessário limitar a leitura e a escrita no disco, tanto quanto possível. Isso não é necessário no CouchDB porque este programa garante que qualquer documento deve ser gravado rapidamente no disco. Apesar de garantir essa abordagem, os dados devem ser gravados de forma segura no disco, também causa impactos significativos em relação ao desempenho. O MongoDB grava em disco somente quando for necessário, o que normalmente ocorreaproximadamente a cada segundo. Isso significa que se um valor estiver sendo atualizado várias vezes por segundo – um cenário que não será incomum se um valor estiver sendo usado como contador de páginas ou para estatísticas em tempo real – então esse valor será gravado somente uma vez, em vez de milhares de vezes, conforme seria exigido pelo CouchDB. A abordagem torna o MongoDB muito mais rápido, mas, novamente, há uma contrapartida. O CouchDB pode ser mais lento, mas ele garante que os dados serão armazenados de forma segura no disco. O MongoDB não oferece esse tipo de garantia, e é por isso que um RDBMS tradicional, provavelmente, será uma solução melhor para gerenciar dados críticos como, por exemplo, de cobrança ou de contabilidade. 25 Fundamentos do mongodB │ unIdade I Armazenando dados binários O GridFS é a solução do MongoDB para armazenar dados binários no banco de dados. O BSON suporta salvar até 4 MB de dados binários em um documento e isso deve ser mais que suficiente para atender às suas necessidades. Por exemplo, se você quiser armazenar uma imagem de perfil ou um clipe de áudio, então 4 MB representa mais espaço do que o necessário. Por outro lado, se você quiser armazenar um trailer de filme, clipes e áudios de alta qualidade ou até mesmo arquivos que tenham centenas de megabytes de tamanho, o MongoDB também tem uma solução para esses casos. O GridFS funciona armazenando informações sobre o arquivo (chamadas de metadados) na coleção files. Os dados propriamente ditos são separados em partes chamadas chunks (porções), que são armazenadas na coleção chunks. Essa abordagem faz com que o armazenamento de dados seja fácil e escalável. Também torna as operações envolvendo intervalos (por exemplo, obter partes específicas de um arquivo) muito mais simples de usar. Falando de modo geral, você deve usar o GridFS por meio do driver do MongoDB para a sua linguagem de programação, portanto é improvável que você vá precisar sujar as mãos com um nível tão baixo de programação. Com tudo mais no MongoDB, o GridFS foi projetado visando tanto à velocidade quanto à escalabilidade. Isso quer dizer que podemos estar certos de que ele estará à altura da tarefa se quisermos trabalhar com arquivos grandes de dados. replicando dados Quando falamos sobre os princípios norteadores por trás do MongoDB, mencionamos que os bancos de dados RDBMS oferecem determinadas garantias para o armazenamento de dados que não estão disponíveis no MongoDB. Essas garantias não foram implementadas por vários motivos. Em primeiro lugar, esses recursos deixariam o banco de dados lento. Em segundo, eles iriam aumentar enormemente a complexidade do programa. Em terceiro, havia uma percepção de que a falha mais comum em um servidor seria de hardware, o que deixaria os dados inutilizáveis, de qualquer maneira, mesmo que eles fossem salvos em disco de forma segura. É claro que nada disso significa que a segurança dos dados não seja importante. O MongoDB não teria muita utilidade se você não pudesse contar com o fato de ser capaz de acessar os dados quando precisar deles. Inicialmente, o MongoDB oferecia uma rede de proteção com um recurso chamado replicação master-slave (mestre-escravo), em que somente um banco de dados estava ativo para escrita em um determinado instante 26 UNIDADE I │ FUNDAmENtos Do moNgoDB – uma abordagem que também é razoavelmente comum no mundo RDBMS. De lá para cá, esse recurso foi substituído por conjuntos de réplicas (replica sets) e a replicação master-slave básica se tornou obsoleta e não deverá mais ser utilizada. Os conjuntos de réplicas têm um servidor principal (semelhante ao master), que cuida de todas as solicitações de escrita dos clientes. Como há somente um servidor principal em um dado conjunto, pode-se garantir que todas as escritas serão tratadas adequadamente. Quando uma escrita ocorrer, ela será registrada no oplog (operation log)1 do servidor principal. Oplog é uma coleção exclusiva que mantém um registro contínuo de todas as operações que modificam os dados armazenados em seus bancos de dados. O oplog é replicado pelos servidores secundários (podem haver vários deles) e usado para que eles se atualizem em relação ao master. Caso o master falhe em determinado instante, um dos servidores secundários se tornará o servidor principal e assumirá a responsabilidade de cuidar das solicitações de escrita dos clientes. implementando o sharding Para as pessoas envolvidas em implantação de sistemas de larga escala, é provável que o autosharding se prove ser um dos recursos mais significativos e mais utilizados do MongoDB. Em um cenário com autosharding, o MongoDB cuidará de todas as separações e recombinações de dados para você. Ele garantirá que os dados serão enviados ao servidor correto e que as queries serão executadas e combinadas da maneira mais eficiente possível. Com efeito, do ponto de vista de um desenvolvedor, não há nenhuma diferença entre conversar com um banco de dados MongoDB com uma centena de shards e conversar com um único servidor MongoDB. Nesse meio tempo, se você estiver começando a usar o MongoDB ou estiver desenvolvendo o seu primeiro site baseado nele, provavelmente descobrirá que uma única instância dele será suficiente para atender às suas necessidades. Se você acabar criando o próximo Facebook ou a próxima Amazon, ficará satisfeito por ter criado o seu site usando uma tecnologia que possa escalar de maneira tão irrestrita. usando as funções map e reduce Para muitas pessoas, ouvir o termo MapReduce provoca calafrios na espinha. No outro extremo, muitos defensores do RDBMS desdenham da complexidade das funções 1 <https://docs.mongodb.com/manual/core/replica-set-oplog/>. 27 Fundamentos do mongodB │ unIdade I map e reduce. Para algumas pessoas, essas funções são assustadoras, pois exigem uma maneira totalmente diferente de pensar na maneira de encontrar e ordenar os dados, e muitos programadores profissionais têm problemas em entender os conceitos subjacentes às funções map e reduce. Apesar do que foi dito, essas funções oferecem uma maneira extremamente eficaz de consultar dados. Com efeito, o CouchDB suporta somente essa abordagem, que é um dos motivos pelos quais ele tem uma curva de aprendizado tão difícil. O MongoDB não exige que você use as funções map e reduce. De fato, o MongoDB depende de uma sintaxe simples de query, que é mais semelhante àquilo que vemos no MySQL. Entretanto o MongoDB disponibiliza essas funções para aqueles que quiserem usá-las. As funções map e reduce estão implementadas em JavaScript e executam no servidor. A função de map é encontrar todos os documentos que atendam determinados critérios. Esses resultados são então passados à função reduce, que processa os dados. A função reduce geralmente não retorna uma coleção de documentos. Ao invés disso, ela retorna um novo documento que contém as informações resultantes. Como regra geral, se você normalmente usar GROUP BY no SQL, então as funções map e reduce provavelmente serão as ferramentas adequadas para realizar a tarefa no MongoDB. o framework de agregação do mongodB O MapReduce é uma ferramenta bastante eficaz, porém tem uma desvantagem importante: ela não é fácil de usar. Muitos sistemas de bancos de dados são utilizados para gerar relatórios e os bancos de dados SQL em particular tornam essa tarefa bem simples. Se quiser agrupar resultados ou encontrar o valor máximo e a média, então será bem simples expressar essa ideia e obter o resultado que você estiver procurando. Infelizmente, não é tão simples fazer isso no MapReduce e você deverá fazer todas as conexões por conta própria. Com frequência, isso pode significar que uma tarefa simples será desnecessariamente desafiadora. Em resposta a isso, a MongoDB Inc (anteriormente, 10gen) acrescentou o framework de agregação. Ele é baseado em pipelines, semelhante aos comandos de piping em shells Linux, e permite encadear partes individuaisde uma query para obter o resultado que você estiver procurando. Isso preserva os benefícios do design orientado a documentos do MongoDB, ao mesmo tempo que possibilita ter um bom desempenho. 28 unidAdE ii fAzEndo A inStAlAção do mongodB CAPítulo 1 qual sistema usar? O MongoDB é um banco de dados multiplataforma e você poderá encontrar uma lista significativa de pacotes disponíveis para download em seu site <www.mongodb.com>. A variedade de versões disponíveis pode fazer com que seja difícil decidir qual é a versão correta. Na seção DOWNLOAD do site do MongoDB, você terá uma visão geral simples dos pacotes disponíveis para download. O primeiro ponto em que você deve prestar atenção é o sistema operacional em que o software do MongoDB será executado. Atualmente, há pacotes pré-compilados disponíveis para Windows, para diversas variantes do sistema operacional Linux, para Mac OS e para Solaris. Você também deverá prestar atenção à versão do software do MongoDB: há versão para produção, versões anteriores e versões em desenvolvimento. A versão para produção (production) indica que essa é a versão estável mais recente sendo disponibilizada. Quando uma versão mais nova e normalmente melhorada ou aperfeiçoada é disponibilizada, a anterior mais estável e mais recente será disponibilizada como uma versão anterior (previous release). Essa designação significa que a versão é estável e confiável, porém, normalmente, conterá menos recursos disponíveis. Por fim, temos a versão de desenvolvimento (development release). Essa versão geralmente é referenciada como sendo instável. É uma versão que ainda está em desenvolvimento e contém várias alterações, inclusive novos recursos significativos. Embora ainda não tenha sido totalmente desenvolvida e testada, os desenvolvedores do MongoDB a disponibilizam para que o público experimente e possa usá-la. O MongoDB utiliza a abordagem de “versões de número ímpar para releases de desenvolvimento”. Em outras palavras, ao observar a segunda parte do número da versão (também chamada de número de release), podemos dizer se uma versão é de desenvolvimento ou se é uma versão estável. Se o segundo número for par, então o 29 Fazendo a Instalação do MongodB │ UnIdade II release será estável. Se o segundo número for ímpar, será um release instável ou de desenvolvimento. Vamos observar detalhadamente os três dígitos incluídos nas três partes A, B e C – de um número de versão. » A - é o primeiro número (ou o número mais à esquerda) -> representa a versão principal e muda somente quando há uma atualização completa da versão. » B - é o segundo número (ou o número do meio) -> representa o número do release e indica se uma versão é de desenvolvimento ou se é estável. Se o número for par, a versão será estável. Se for ímpar, a versão será instável e considerada como um release de desenvolvimento. » C - é o terceiro número (o número mais à direita) -> representa o número da revisão e é usado para correção de bugs e de problemas de segurança. o mongodB no linux Os sistemas operacionais baseados em Unix são opções extremamente populares atualmente para hospedar serviços, incluindo web services, serviços de e-mail e, é claro, serviços de bancos de dados. No Linux, ou popular Ubuntu, há duas maneiras de instalar: você pode instalar os pacotes automaticamente por meio dos chamados repositórios ou pode instalá-lo manualmente. As duas próximas seções descreverão ambas as opções. instalando o mongodB por meio de repositórios Os repositórios basicamente são diretórios on-line cheios de software. Todo pacote contém informações sobre o número da versão, os prerrequisitos e possíveis incompatibilidades. Essas informações serão úteis quando for necessário instalar um pacote de software que exija outro software a ser instalado antes, pois os prerrequisitos podem ser instalados ao mesmo tempo. Os repositórios-padrões disponíveis para o Ubuntu (e para outras distribuições baseadas em Debian) contêm o MongoDB, mas podem ter versões desatualizadas do software. Sendo assim, vamos dizer ao apt-get (o software usado para instalar softwares a partir de repositórios) que olhe um repositório personalizado. Para isso, será necessário acrescentar a linha a seguir à sua lista de repositórios (/etc/apt/sources.Iist). 30 UNIDADE II │ FAzENDo A INstAlAção Do MoNgoDB deb <http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen>. Em seguida, importe a chave GPG pública do MongoDB Inc, usada para assinar os pacotes, garantindo a sua consistência. Isso pode ser feito por meio do comando apt-key: $sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 Após ter feito esse procedimento, será preciso dizer ao apt-get que há novos repositórios, isso pode ser feito por meio do comando update do apt-get $sudo apt-get update Essa linha fez o aptitude tomar conhecimento de seu repositório adicionado manualmente. Isso significa que agora você pode dizer ao apt-get para instalar o software. Faça isso digitando o comando a seguir no shell: $sudo apt-get install mongodb-org Essa linha instala a versão atual estável (de produção) do MongoDB. Se você quiser instalar qualquer outra versão, será preciso especificar o número dela. Por exemplo, para instalar a versão atual instável (de desenvolvimento) do MongoDB, digite o comando a seguir no lugar do comando anterior: $sudo apt-get install mongodb-org=3.2.0 Isso é tudo que é preciso fazer. A essa altura, o MongoDB terá sido instalado e estará (quase) pronto para ser usado! instalando o mongodB manualmente Considerando como é fácil instalá-lo automaticamente com o aptitude, você poderá estar se perguntando por que iria querer instalar o software manualmente. Para começar, nem todas as distribuições Linux usam apt-get. Com certeza, muitas delas o utilizam (incluindo pincipalmente aquelas que são baseadas no Debian Linux), mas algumas não o fazem. Além do mais, os pacotes disponibilizados permanecem como um trabalho em progresso, portanto, pode haver ocasiões em que as versões ainda não estejam disponíveis por meio dos repositórios. Também é possível que a versão do MongoDB que você queira usar não esteja incluída no repositório. Instalar o software manualmente também possibilita executar diversas versões do MongoDB ao mesmo tempo. 31 Fazendo a Instalação do MongodB │ UnIdade II Você já decidiu qual versão gostaria de usar e fez seu download a partir do site <http:// mongodb.org/downloads> para o seu diretório Home. A seguir, você deve extrair o conteúdo do pacote usando o comando a seguir. O MongoDB já está pronto! $ tar xzf mongodb-linux-x86_64-latest.tgz instalando o mongodB no Windows O Microsoft Windows também é uma opção popular para software de servidores, incluindo aqueles que disponibilizam serviços baseados em Internet. O Windows não tem uma aplicação de repositório como o apt-get, portanto será necessário fazer download e extrair o software a partir do site do MongoDB para executá-lo. Sim, a informação anterior está correta. Não é preciso passar por nenhum processo de instalação, instalar o software é simplesmente uma questão de fazer download do pacote, extrair o seu conteúdo e executar a aplicação propriamente dita. Por exemplo, suponha que você tenha decidido fazer download da versão estável mais recente do MongoDB para o seu servidor Windows 2012 de 64 bits. Comece extraindo o conteúdo do pacote (mongodb-win32-x86_64-x.y.x.zip) na raiz de seu drive C:\. Nesse ponto, tudo que você deve fazer é abrir um prompt de comandos usando Start > Run > cmd > OK (Iniciar > Executar > cmd > OK) e acessar o diretório em que o conteúdo foi extraído: » cd C:\mongodb-win32-x86_64-x.y.z\ » cd bin\ Fazer isso levará você até o diretório que contém os executáveis do MongoDB. Isso é tudo que precisa ser feito. Nenhuma instalação será necessária. 32 CAPítulo 2 mongodB em execução Antes de poder iniciar o serviço, é preciso criar umdiretório de dados em que o MongoDB irá armazenar seus arquivos. Por padrão, ele armazena os dados no diretório /data/ db em sistemas baseados em Unix (por exemplo, no Linux e no OS X) e no diretório C:\data\db no Windows. O MongoDB não cria esses diretórios de dados automaticamente, portanto é preciso criá-los manualmente, do contrário, o MongoDB provocará uma falha na execução e irá gerar uma mensagem de erro. Além do mais, não se esqueça de definir as permissões corretamente. Devem ter permissões de leitura e de escrita, além de permissão para criar diretórios, para que funcione apropriadamente. Se quiser usar um diretório diferente de /data/db ou de C:\data\db, você poderá dizer ao MongoDB que olhe para o diretório desejado ao usar a flag --dbpath quando o serviço for executado. Após ter criado o diretório necessário e de ter atribuído as permissões apropriadas, o serviço principal de banco de dados do MongoDB poderá ser iniciado por meio da execução da aplicação mongod. Isso pode ser feito a partir do prompt de comandos ou do shell no Windows e no Linux, respectivamente. Analisando o layout da instalação Após ter instalado e extraído o MongoDB com sucesso, você terá as aplicações mostradas na tabela 1 disponíveis no diretório bin (tanto no Linux quanto no Windows). tabela 1. as aplicações incluídas no mongodB. Aplicação Função -- bsondump Lê conteúdo de arquivos de rollback em formato BSON -- mongo É o shell do banco de dados -- mongod É o servidor principal do banco de dados -- mongodump Utilitário de backup do banco de dados -- mongoexport Utilitário para exportação (JSON, CSV, TSV); não é confiável para backups -- mongofiles Manipula arquivos em objetos GridFS -- mongoimport Utilitário de importação (JSON, CSV, TSV); não é confiável para recuperação de dados -- mongoplog Obtém entradas de oplog de outra instância do mongod -- mongoperf Verifica o desempenho de I/O em disco -- mongorestore Utilitário para restauração de backup de banco de dados -- mongos Processo de roteamento para sharding do Mongodb 33 Fazendo a Instalação do MongodB │ UnIdade II Aplicação Função -- mongosniff Faz sniff/trade das atividades de banco de dados MongoDB em tempo real; somente para sistemas do tipo Unix -- mongostat Retorna contadores relativos à operação do banco de dados -- mongotop Monitora/informa atividades de leitura/escrita do MongoDB -- mongorestore Utilitário para restauração/importação Fonte: mongodB (2017) Todas as aplicações estão no diretório - - bin. Os softwares instalados incluem 15 aplicações (ou 14 no Microsoft Windows) que serão utilizadas em conjunto com seus bancos de dados MongoDB. As duas aplicações mais importantes são mongo e mongod. A aplicação mongo possibilita usar o shell do banco de dados, esse shell permite executar praticamente tudo o que você quiser no MongoDB. A aplicação mongod inicia o serviço ou o daemon, como também ele é chamado. Há também diversas flags que podem ser definidas ao iniciar as aplicações do MongoDB. Por exemplo, o serviço permite especificar o path em que o banco de dados está localizado (--dbpath), mostra informações sobre a versão (--version) e até mesmo exibe algumas informações de diagnóstico do sistema (com a flag --sysinfo). A lista completa de opções pode ser visualizada se incluirmos a flag --help quando o serviço for iniciado. Por enquanto, você pode simplesmente usar os defaults e iniciar o serviço digitando mongod em seu shell ou no prompt de comandos. o shell do mongodB Após ter criado o diretório do banco de dados e de ter iniciado a aplicação de banco de dados mongod com sucesso, você estará pronto para iniciar o shell e dar uma espiada no que o MongoDB é capaz de fazer. Inicie o seu shell (Unix) ou o seu prompt de comandos (Windows). Ao fazer isso, certifique-se de estar no local correto para que o executável do mongo possa ser encontrado. O shell pode ser iniciado ao digitar mongo no prompt de comandos e teclando Return. Você verá imediatamente uma janela em branco e um cursor “piscante” (veja a figura 1). Bem-vindos ao MongoDB! 34 UNIDADE II │ FAzENDo A INstAlAção Do MoNgoDB Figura 1. o shell do mongodB. Fonte: pearson (2017). Se o serviço MongoDB for iniciado com os parâmetros default e o shell for iniciado com as configurações default, você será conectado ao banco de dados default test, que estará executando em seu host local. Esse banco de dados é criado automaticamente no instante em que você se conectar a ele. Esse é um dos recursos mais eficazes do MongoDB. Se você tentar se conectar a um banco de dados que não exista, o MongoDB irá criá-lo automaticamente. Antes de dar qualquer passo adicional, por exemplo, implementar um driver adicional que possibilite trabalhar com sua linguagem de programação favorita, você poderá achar útil dar uma olhada rápida em alguns dos comandos mais úteis disponíveis no shell do MongoDB, que podem ser vistas na tabela 2. tabela 2. as aplicações incluídas no mongodB. Comando Função show dbs Monstra os nomes dos bancos de dados disponíveis show collections Mostra as coleções no banco de dados corrente show users Mostra os usuários no banco de dados corrente use <nome do db> Define o banco de dados corrente para <nome do db> Fonte: mongodB (2017). Você pode obter uma lista completa dos comandos ao digitar o comando help no shell do MongoDB. 35 CAPítulo 3 Suporte de drivers A 10gen disponibiliza vários drivers oficiais e há muitos outros oferecidos pela comunidade. Por exemplo, os drivers para as linguagens de programação a seguir podem ser encontrados no site do MongoDB: » C » C++ » C# » Erlang » Go » Java » JavaScript » Node.js » Perl » PHP » Python » Ruby » Scala Como exemplo, iremos implementar o MongoDB em apenas uma opção de linguagem de programação: o PHP. A qualquer momento é possível verificar no site <www.mongodb.com> outros drivers disponibilizado pela comunidade. O PHP é uma das linguagens de programação mais populares atualmente. Essa linguagem está especificamente voltada para o desenvolvimento web e pode ser incorporada facilmente ao HTML. Esse fato faz com que essa linguagem seja uma 36 UNIDADE II │ FAzENDo A INstAlAção Do MoNgoDB candidata perfeita para o design de uma aplicação web, por exemplo, um blog, um livro de visitas ou até mesmo um banco de dados de cartões de visita. o mongodB sendo usado com PHP Assim como o MongoDB, o PHP é uma ferramenta de desenvolvimento multiplataforma, e os passos necessários para configurar o MongoDB no PHP variam de acordo com a plataforma que se pretende usar. Já mostramos na seção anterior, como instalar o MongoDB tanto no Ubuntu quanto no Windows. Usaremos a mesma lógica para instalar o driver para PHP tanto em um quanto em outro. Comece fazendo download do driver de PHP para o seu sistema operacional. Faça isso iniciando o seu navegador e acessando <www.mongodb.com>. Como exemplo, a Figura 2 mostra a interface para o driver PHP. Figura 2. site do mongodB para download do driver pHp. Fonte: mongodB (2017). Diferentes sistemas operacionais irão exigir abordagens distintas para instalar automaticamente a extensão do MongDDB para PHP. Do mesmo modo que você pode instalar o MongoDB no Ubuntu automaticamente, o mesmo poderá ser feito no caso do driver de PHP. E da mesma maneira que ocorreu na instalação do MongoDB no Ubuntu, você também pode optar por instalar o driver da linguagem PHP manualmente. Vamos dar uma olhada nas duas opções disponíveis a você. 37 Fazendo a Instalação do MongodB │ UnIdade II instalando automaticamente o driver de PHP em plataformas baseadas em unix Os desenvolvedores de PHP criaram uma ótima solução que permite expandir sua instalação de PHP com outras extensões populares: o PECL. Trata-se de um repositório projetado exclusivamente para o PHP, ele disponibiliza um diretório com todas as extensões conhecidas, que pode ser usado para fazer download,instalar e até mesmo desenvolver extensões PHP. Se você já conhece o sistema de gerenciamento de pacotes chamado aptitude (que usamos anteriormente para instalar o MongoDB), você ficará satisfeito com a semelhança da interface do PECL em relação ao aptitude. Supondo que você tenha o PECL instalado em seu sistema, abra um console e digite o comando a seguir para instalar a extensão do MongoDB: $sudo pecl install mongo Esse comando faz com que o PECL faça download e instale automaticamente a extensão do MongoDB para o PHP. Em outras palavras, o PECL fará o download da extensão para a sua versão de PHP e a colocará no diretório de extensões do PHP. Há somente um detalhe: o PECL não adiciona a extensão automaticamente à lista de extensões carregadas, será preciso executar esse passo manualmente. Para isso, abra um editor de texto (qualquer editor de texto de sua preferência) e altere o arquivo chamado php. ini, que é o arquivo de configuração principal usado pelo PHP para controlar o seu comportamento, incluindo as extensões a serem carregadas. A seguir, abra o arquivo php.ini, faça rolagens até a seção de extensões e acrescente a linha a seguir para dizer ao PHP que carregue o driver do MongoDB: extension=mongo.so instalando manualmente o driver de PHP em plataformas baseadas em unix Se preferir compilar o driver por conta própria ou se, por algum motivo, não puder usar a aplicação PECL conforme descrito anteriormente (seu provedor de hosting pode não suportar essa opção, por exemplo), você poderá também optar por fazer o download do código-fonte do driver e compilá-lo manualmente. Para fazer download do driver, acesse o site do github <http://github.com>. Esse site disponibiliza o pacote de códigos-fontes mais recentes para o driver de PHP. Depois de ter feito o download, será necessário extrair o conteúdo do pacote e executar o make para o driver, executando o conjunto de comandos a seguir: 38 UNIDADE II │ FAzENDo A INstAlAção Do MoNgoDB $ tar zxvf mongodb-mongdb-php-driver-<commit_id>.tar.gz $ cd mongodb-mongodb-php-driver-<commit_id> $ phpize $ ./configure $ sudo make install Depois que o processo estiver concluído, o seu driver para PHP do MongoDB estará instalado e pronto para ser usado! Após executar os comandos, você verá o local em que o driver foi colocado. Normalmente, a saída terá uma aparência semelhante a: Installing ‘/ usr/lib/php/extensions/no-debug-zts-20060613/mongo.so’ É preciso confirmar se esse é o mesmo diretório em que o PHP, por padrão, armazena suas extensões. O comando a seguir pode ser usado para confirmar o local em que o PHP armazena suas extensões: $ php –i | grep extension_dir Essa linha mostra o diretório em que todas as extensões do PHP devem ser colocadas. Se esse diretório não corresponder ao diretório em que o driver mongo.so foi colocado, você deverá transferir esse driver para o diretório adequado de modo que o PHP saiba onde encontrá-lo. Como antes, será preciso dizer ao PHP que a extensão recém-criada foi colocada em seu diretório de extensões e que ele deverá carregar essa extensão. Isso pode ser especificado modificando a seção de extensões do arquivo php.ini; acrescente a linha a seguir nessa seção: extension=mongo.so Por fim, será preciso reinicializar o seu servidor de aplicação. Se o serviço Apache HTTPd estiver sendo usado, isso poderá ser feito por meio do comando de serviço a seguir: sudo /etc/init.d/apache2 restart Esse processo é um pouco mais longo do que usar o método automatizado do PECL. Entretanto, se o PECL não puder ser utilizado, ou se você for um desenvolvedor de driver e estiver interessado em correções de bugs, utilize o método manual. 39 Fazendo a Instalação do MongodB │ UnIdade II instalando o driver de PHP no Windows Anteriormente, vimos como instalar o MongoDB em seu sistema operacional Windows. Agora vamos ver como implementar o driver do MongoDB para PHP no Windows. No caso do Windows, há binários pré-compilados disponíveis para cada versão do driver de PHP para o MongoDB. Esses binários podem ser obtidos a partir do site do github mencionado anteriormente (http://github.com). O maior desafio, nesse caso, é escolher o pacote correto a ser instalado para a sua versão de PHP (uma enorme variedade de pacotes está disponível). Se você não estiver certo sobre a versão do pacote de que precisará, o comando <? phpinfo(); ?> poderá ser usado em uma página PHP para saber exatamente qual delas é adequada ao seu ambiente especifico. Após ter feito download do pacote correto e de ter extraído o seu conteúdo, tudo que é preciso fazer é copiar o arquivo do driver (chamado php_mongo.dll) para o seu diretório de extensões do PHP, isso permite que o PHP o carregue. Conforme a versão de seu PHP, o diretório de extensões pode ser chamado Ext ou Extensions. Se não tiver certeza de qual deve ser o diretório, você poderá examinar a documentação do PHP que acompanha a versão instalada em seu sistema. Após ter colocado a DLL do driver no diretório de extensões do PHP, será necessário dizer ao PHP para carregar o driver. Faça isso alterando o arquivo php.ini e adicionando a seguinte linhana seção de extensões: extension=php_mongo.dll Após, reinicie o servidor de aplicação do seu sistema e estará pronto para usar o driver do MongoDB no PHP. 40 unidAdE iiimodElAgEm do mongodB CAPítulo 1 Como modelar? Nessa última unidade, desviaremos nossa atenção do sistema operacional e passaremos a analisar o design geral de um banco de dados MongoDB. Especificamente, você aprenderá o que são coleções, qual é a aparência de um documento, como os índices funcionam e o que eles fazem. Evolução dos modelos de dados Não se pode falar dos modelos de dados atuais sem antes fazer uma referência aos antigos modelos de dados que de certa forma foram úteis e impulsionaram o surgimento de outros modelos. Desde os primórdios da informática, o homem tem procurado encontrar a melhor forma de armazenar e manipular informações do seu mundo real, em sistemas informatizados. Antes dos modernos sistemas de gestão de bases de dados, outras formas de armazenamento e modelos de dados foram utilizadas, cujas mais populares serão apresentadas a seguir. Sistema de gestão de ficheiros (Sgf) A primeira forma encontrada para lidar com o armazenamento de dados baseou-se nos Sistemas de Gestão de Ficheiros (SGF), que representam uma forma de organizar e armazenar dados em meios de armazenamento em massa. Com os SGF foi possível automatizar algumas tarefas, que até então eram realizadas manualmente, tornando a execução dessas tarefas mais rápida. Para cada nova aplicação era necessário definir novos ficheiros de dados e desenvolver os programas necessários para os processamentos específicos. Nos SGF cada sistema era considerado como um sistema isolado, sem relação com outros sistemas já existentes. Mas os sistemas de gestão ficheiros apresentavam, no entanto, algumas limitações, como por exemplo, a dificuldade em fazer o controle de acesso, quando o sistema ou 41 ModelageM do MongodB │ UnIdade III aplicação era utilizado por vários utilizadores ou por vários processos ao mesmo tempo. Para além dessas limitações, existiam outros inconvenientes nos SGF, nomeadamente: » Redundância de informação – originada pela forma desarmonizada de criar os ficheiros e da forma independente de efetuar atualizações dos dados, que dava origem a duplicação de dados. » Inconsistência dos dados – muitas vezes uma consequência direta da redundância. » Dificuldade em extrair a informação – devido à estrutura dos ficheiros que dificultava o acesso aos campos nos quais estava a informação. » Informação dispersa – estando os dados em diferentes ficheiros, uma mesma informação poderia ser encontrada em formatos diferentes, em cada um dos ficheiros. » Integridade dos dados – tarefa difícil de conseguir e que só poderia ser assegurada, mediante a criação de regras em cada aplicaçãoque fizesse uso dos ficheiros. modelo de dados hierárquico Um banco de dados hierárquico consiste em uma coleção de registros que são conectados uns aos outros por meio de ligações. Um registro é uma coleção de campos, cada qual contendo apenas um valor de dados. Uma ligação é uma associação entre exatamente dois registros. O modelo hierárquico é, portanto, similar ao modelo de rede, no sentido de que dados e relacionamentos entre dados são também representados por registros e ligações, respectivamente. O modelo hierárquico difere do modelo de rede na organização de registros como coleção de árvores ao invés de grafos arbitrários, conforme pode ser visto na Figura 3. Figura 3. modelo de dados Hierárquico. Fonte: Korth (1995). 42 UNIDADE III │ MoDElAgEM Do MoNgoDB Um diagrama com estrutura de árvore é um esquema para um banco de dados hierárquico. Tal diagrama consiste em dois componentes básicos: retângulos, que correspondem a tipos de registro, e linhas, que correspondem às ligações. O diagrama com estrutura de árvore serve para os mesmos propósitos que um diagrama entidade-relacionamento; a saber, ele especifica a estrutura lógica geral do banco de dados. Um diagrama com estrutura de árvore é similar ao diagrama de estrutura de dados no modelo de rede. A principal diferença é que, no primeiro, tipos de registro são organizados na forma de uma árvore enraizada. Para todo diagrama entidade-relacionamento, existe um diagrama com estrutura de árvore correspondente. O esquema de banco de dados é, portanto, representado como uma coleção de diagramas com estrutura de árvore. Para cada diagrama, existe uma única instância de uma arvore do banco de dados. A raiz dessa árvore é um nó auxiliar. Os filhos desse nó são instâncias, de fato, do tipo de registro apropriado. Cada instância pode, por sua vez ter diversas instâncias de vários tipos de registro, como especificadas no diagrama com estrutura de árvore correspondente. A linguagem de manipulação de dados consiste em uma série de comandos que são embutidos em uma linguagem hospedeira. Esses comandos fazem o acesso e manipulam itens do banco de dados assim como variáveis declaradas localmente. Para cada programa de aplicação o sistema mantém uma área de trabalho de programa que contém gabaritos de registro, ponteiros correntes e indicadores de estado. Os itens de dados são buscados por meio do comando get, que localiza um registro no banco de dados e posiciona o ponteiro corrente para apontar para ele, e então copia aquele registro do banco de dados para o gabarito de área de trabalho do programa apropriado. Existe uma série de diferentes formas do comando get. A principal distinção entre elas é se um registro deve ser localizado dentro de toda a árvore de um banco de dados ou dentro de uma sub-árvore. Vários mecanismos estão disponíveis para atualizar informações no banco de dados. Eles incluem a criação e a remoção de registros (via operações insert e delete) e a modificação (via operação replace) do conteúdo dos registros existentes. No caso de relacionamentos muitos-para-muitos, a duplicação de registros é necessária para preservar a estrutura de árvore do banco de dados. A duplicação de registros tem dois inconvenientes principais: atualizações podem levar a inconsistência de dados e o desperdício de espaço é inevitável. A solução é o registro virtual, tal registro não contém valores de dados, ele contém um ponteiro lógico para um registro físico. Quando um registro é duplicado em diversas árvores de banco de dados, uma única cópia daquele registro é mantida em uma das árvores e todas as outras ocorrências são substituídas por um registro virtual contendo um ponteiro para aquele registro físico. A linguagem 43 ModelageM do MongodB │ UnIdade III de manipulação de dados para essa nova configuração leva ao mesmo caso em que a duplicação de registro é permitida. Assim, um usuário não precisa preocupar-se com essas mudanças. A implementação de bancos de dados hierárquicos não usa ponteiros pai-filho, uma vez que eles requerem o uso de registros de tamanho variável. Em vez disso, são usadas cadeias em pré-ordem. Essa técnica permite que cada registro contenha exatamente dois ponteiros. Opcionalmente, um terceiro ponteiro filho – para – pai pode ser adicionado (KORTH, 1995). modelo de dados em rede O modelo em redes surgiu como uma extensão ao modelo hierárquico, eliminando o conceito de hierarquia e permitindo que um mesmo registro estivesse envolvido em várias associações. No modelo em rede, os registros são organizados em grafos onde aparece um único tipo de associação (set) que define uma relação 1:N entre 2 tipos de registros: proprietário e membro. Desta maneira, dados dois relacionamentos 1:N entre os registros A e D e entre os registros C e D é possível construir um relacionamento M:N entre A e D. O gerenciador Data Base Task Group (DBTG) criado pela CODASYL (Committee on Data Systems and Languages) nos anos 70 já estabelecia normas que prevaleciam nos modelos de banco de dados, com linguagem própria para definição e manipulação de dados. Os dados tinham uma forma limitada de independência física. A única garantia era que o sistema deveria recuperar os dados para as aplicações como se eles estivessem armazenados na maneira indicada nos esquemas. Os geradores de relatórios da CODASYL também definiram sintaxes para dois aspectos chaves dos sistemas gerenciadores de dados: concorrência e segurança. O mecanismo de segurança fornecia uma facilidade na qual parte do banco de dados (ou área) pudesse ser bloqueada para prevenir acessos simultâneos, quando necessário. A sintaxe da segurança permitia que uma senha fosse associada a cada objeto descrito no esquema. Ao contrário do Modelo Hierárquico, em que qualquer acesso aos dados passa pela raiz, o modelo em rede possibilita acesso a qualquer nó da rede sem passar pela raiz. O diagrama para representar os conceitos do modelo em redes consiste em dois componentes básicos: Caixas, que correspondem aos registros e Linhas, que correspondem às associações. fazendo o design do banco de dados O banco de dados MongoDB não é relacional nem tem esquemas. Significa que um banco de dados MongoDB não está associado a nenhuma coluna ou tipo de dado 44 UNIDADE III │ MoDElAgEM Do MoNgoDB predefinido como ocorre com bancos de dados relacionais (por exemplo, o MySqL). A principal vantagem dessa implementação é a extrema flexibilidade para trabalhar com os dados, pois não há nenhuma estrutura predefinida necessária em seus documentos. Falando de maneira simples você será perfeitamente capaz de ler uma coleção que contenha centenas ou até mesmo milhares de documentos, cada qual com uma estrutura diferente sem transgredir nenhuma regra dos bancos de dados MongoDB. Uma das vantagens desse design flexível e sem esquemas é que você não terá restrições ao programar em uma linguagem com tipos dinâmicos como Python ou PHP. Com efeito, se sua linguagem de programação for extremamente flexível e dinâmica não poderia ser usada em todo o seu potencial por causa das restrições inatas de seu banco de dados, isso constituiria uma severa limitação. Vamos dar outra olhada na aparência do design de dados em um documento do MongoDB, prestando atenção em particular à maneira como os dados são flexíveis nesse banco de dados quando comparados a um banco de dados relacional. No MongoDB, um documento é um item que contém os dados propriamente ditos e é comparável a uma linha no SQL. No exemplo a seguir, você verá como dois tipos totalmente diferentes de documento podem coexistir em uma única coleção chamada Media (observe que uma coleção, de modo geral, é o equivalente a uma tabela do mundo SQL): { “Type”: “CD”, “Artist”: “Nirvana”, “Title’: “Nevernind”, “Genre”: “Grunge”, “Releasedate”: “1991.09.24”, “Tracklist”: [ { “Track” : “1”, “Title” : “Smells Like Teen Spirit”, “Length” : “5:02” }, 45 ModelageM
Compartilhar