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 ModelageMdo MongodB │ UnIdade III { “Track” : “1”, “Title” : “In Bloom”, “Le,gth” : “4:15” } ] } { “type”: “Book”, “Title”: “Definitive Guide to MongoDB : A complete guide to dealing with Big Data using MongoDB 2nd, The”, “ISBN”: “987-1-4302-5821-6”, “Publisher”: “Apress”, “Author”: [ “Hows, David” “Plugge, Eelco”, “Membrey, Peter”, “Hawkins, Tim ] } Como você pode ter percebido ao observar esse par de documentos, a maioria dos campos não tem uma relação muito próxima. Sim, ambos têm campos chamados Title e Type, entretanto, exceto por essa semelhança, os documentos são totalmente diferentes. Apesar disso, esses dois documentos estão contidos em uma única coleção chamada Media. 46 UNIDADE III │ MoDElAgEM Do MoNgoDB O MongoDB é chamado de banco de dados sem esquemas (schemaless), mas isso não significa que sua estrutura de dados seja completamente desprovida de esquemas. Por exemplo, você deve definir coleções e índices no MongoDB. Contudo não é necessário predefinir uma estrutura para nenhum dos documentos que serão adicionados, como ocorre quando trabalhamos com o MySQL, por exemplo. Falando de maneira simples, o MongoDB é um banco de dados extraordinariamente dinâmico, o exemplo anterior jamais funcionaria em um banco de dados relacional, a menos que você também adicionasse cada possível campo à sua tabela. Fazer isso seria um desperdício de espaço e pioraria o desempenho, sem mencionar que haveria um elevado nível de desorganização. Explorando as coleções Você pode pensar em uma coleção como um contêiner que armazene seus documentos (ou seja, dados), conforme Figura 4. Figura 4. o modelo de um banco de dados mongodB. Fonte: o autor (2017). Agora compare o modelo do banco de dados do MongoDB com um modelo típico de um banco de dados relacional (veja a figura 5). Como podemos ver, a estrutura geral é a mesma nos dois tipos de banco de dados, apesar disso, eles não são utilizados, nem de longe, de maneira semelhante. 47 ModelageM do MongodB │ UnIdade III Figura 5. o modelo típico de um banco de dados relacional. Fonte: o autor (2017). Há vários tipos de coleções no MongoDB. O tipo de coleção default é expansível quanto ao tamanho: quanto mais dados forem adicionados, maior será a coleção. Também é possível definir coleções que sejam do tipo “capped” (coleção limitada). Toda coleção no MongoDB tem um nome único. Esse nome deve começar com uma letra ou, opcionalmente, com um underscore ( _ ), quando criado por meio da função createcollection. O nome pode conter números e letras, mas o símbolo $ é reservado para uso do mongodb. De modo semelhante, usar uma string vazia (“ “) não é permitido, o caractere nulo não pode ser usado no nome, que tampouco poderá começar com a string “system.”. Em geral, é recomendável manter o nome da coleção simples e compacto (cerca de nove caracteres). No entanto, o número máximo de caracteres permitido para o nome de uma coleção é 118, menos o número de caracteres do nome do banco de dados e o caractere ponto adicional usado como separador. Obviamente, não há muitos motivos práticos para criar um nome tão longo assim. A combinação mencionada anteriormente, composta pelo nome do banco de dados, “ponto” e o nome da coleção, é chamada de namespace. Um único banco de dados tem um limite default de 24 mil namespaces. Cada coleção tem pelo menos dois namespaces: um para a coleção propriamente dita e mais um para o indice_id default criado para a coleção. Porém, se você acrescentar mais índices por coleção, outro namespace será usado. Teoricamente, isso significa que cada banco de dados pode ter até 12 mil coleções por padrão, supondo que cada coleção tenha somente um índice. Entretanto esse limite na quantidade de namespaces pode ser aumentado se fornecermos o parâmetro nssize quando a aplicação do serviço MongoDB (mongod) for executada. 48 UNIDADE III │ MoDElAgEM Do MoNgoDB usando documentos Um documento é constituído de pares de chave-valor. Por exemplo, o par “type”: “Book” é constituído de uma chave chamada type e de seu valor Book. As chaves são escritas na forma de strings, porém seus valores podem variar enormemente. Os valores podem ter qualquer tipo de dado entre um conjunto variado, por exemplo, podem ser arrays ou até mesmo dados binários. Lembre-se de que o MongoDB armazena seus dados em formato BSON. Abaixo seguem todos os tipos de dados possíveis que podem ser adicionados a um documento e com que finalidades eles são utilizados: String Esse tipo de dado comumente usado contém uma string texto (ou qualquer outro tipo de caractere). É usado principalmente para armazenar valores textuais (por exemplo, {“Country” : “Japan”}). Integer (inteiro, 32b e 64b) É usado para armazenar um valor numérico (por exemplo, { “Rank” : 1 } ). Observe que não há aspas antes nem depois do inteiro. Boolean (booleano) Esse tipo de dado pode ser definido como TRUE ou FALSE. Double É usado para armazenar valores de ponto flutuante. Chaves Min/Max É usado para comparar um valor em relação aos elementos BSON de valor mínimo e máximo, respectivamente. Arrays É usado para armazenar arrays. Por exemplo, [“Membrey, Peter”, “Plugge”, Eelco”, “Hows, David”]. Timestamp É usado para armazenar um timestamp. Pode ser prático para registrar o momento em que um documento foi modificado ou adicionado. Object (objeto) É usado para documentos internos (embedded documents) Null (nulo) É usado para um valor igual a Null Symbol (símbolo) É usado da mesma maneira que uma string, entretanto, em geral é reservado para linguagens que utilizam um tipo específico de símbolo. Date (data) É usado para armazenar a data ou a hora correntes em formato de tempo Unix (tempo POSIX). Object ID (ID de objeto) É usado para armazenar o ID do documento. Binary data (dados binários) É usado par armazenar dados binários. Regular expression (expressão regular) É usado para expressões regulares. Todas as opções são representadas por caracteres específicos em ordem alfabética. JavaScript Code (código JavaScript) É usado para código JavaScript. Fonte: mongodB (2017). Os cinco últimos tipos de dados (data, ID de objeto, dados binários, regex e código JavaScript) não são tipos JSON especificamente, são tipos especiais de dados que o BSON permite usar. Teoricamente, tudo isso provavelmente soa como se fosse algo muito simples. Porém, você poderá estar se perguntando como realmente fará o design do documento, incluindo que informações serão inseridas nele. Pelo fato de um documento poder conter qualquer tipo de dado, você pode achar que não haverá necessidade de referenciar informações a partir de outro documento. 49 CAPítulo 2 momento integração Após conhecer alguns recursos do banco de dados NoSQL MongoDB, vamos apresentar algumas integrações de tecnologias. usar o mongoChef com uma conta do Azure Cosmos dB: APi para mongodB Vi recentemente algumas integrações e uma me chamou atenção: conectar a uma conta do Azure Cosmos DB usando API para MongoDB! Para isso é necessário: 1. Baixar e instalar o MongoChef2; 2. Ter as informações de cadeia de conexão de sua conta do Azure Cosmos DB: API para MongoDB. Caso você tenha visto algo sobre Azure Cosmos DB, ótimo! Pule para seção 2.3. Caso não conheça, abaixo trago os conceitos do Azure. Azure Cosmos dB O BD Cosmos do Azure é o multimodelo de banco de dados distribuído globalmente da Microsoft. Com o clique de um botão, o BD Cosmos do Azure permite que você dimensione a taxa de transferência e o armazenamento de maneira elástica e independente em qualquer número de regiões geográficas do Azure. Ele oferece garantias de taxa de transferência, disponibilidade, latência e consistência com SLAs (contratos de nível de serviço) abrangentes, algo que nenhum outro serviço de banco de dados pode oferecer. Você pode experimentar o Azure Cosmos DB sem uma assinatura do Azure, gratuitamente e sem compromisso conforme a Figura 6 . 2 <https://studio3t.com/>.50 UNIDADE III │ MoDElAgEM Do MoNgoDB Figura 6. azure cosmos dB. Fonte: microsoft (2017). Como um serviço de banco de dados distribuído globalmente, o Azure Cosmos DB fornece as seguintes funcionalidades para ajudá-lo a criar aplicativos altamente responsivos e escalonáveis: » Distribuição global turnkey; » Vários modelos de dados e APIs populares para acessar e consultar dados; » Dimensionar elasticamente a taxa de transferência e o armazenamento sob demanda, em todo o mundo; » Criar aplicativos altamente responsivos e críticos; » Garantir disponibilidade “sempre ativa”; » Escrever aplicativos distribuídos globalmente, da maneira correta; » Garantia do dinheiro de volta; » Sem gerenciamento de esquema/índice de banco de dados; » Baixo custo de propriedade. Qualquer sistema web, aplicativos para celular, jogos e aplicativos de IoT que precisam lidar com grandes quantidades de leituras e gravações em uma escala global com baixo tempo de resposta para uma variedade de dados se beneficiará da disponibilidade, alta taxa de transferência, baixa latência e consistência ajustável garantida do Azure Cosmos DB. 51 ModelageM do MongodB │ UnIdade III Criar uma conexão com mongoChef Para adicionar sua conta do Azure Cosmos DB (API para MongoDB) ao gerenciador de conexões do MongoChef, realize as etapas a seguir. 1. Recupere as informações de conexão do Azure Cosmos DB usando as instruções descritas aqui. Figura 7. conexão com o mongochef. Fonte: microsoft (2017). 2. Clique em Conectar para abrir o Gerenciador de Conexões e clique em Nova Conexão Figura 8. nova conexão com o mongochef. Fonte: microsoft (2017). 52 UNIDADE III │ MoDElAgEM Do MoNgoDB 3. Na janela Nova Conexão, na guia Servidor, insira o HOST da conta do Azure Cosmos DB e a porta. Figura 9. configurando servidor. Fonte: microsoft (2017). 4. Na janela Nova Conexão, na guia Autenticação, escolha o Padrão do Modo de Autenticação (MONGODB-CR ou SCARM-SHA-1) e insira USERNAME e PASSWORD. Aceite o banco de dados de autenticação padrão (admin) ou forneça seu próprio valor. Figura 10. configurando servidor. Fonte: microsoft (2017). 53 ModelageM do MongodB │ UnIdade III 5. Na janela Nova Conexão, na guia SSL, marque a caixa de seleção Usar protocolo SSL para se conectar e o botão de opção Aceitar certificados SSL de servidor autoassinados. Figura 11. Habilitando ssl. Fonte: microsoft (2017). 6. Clique no botão Testar Conectividade para validar as informações de conexão, clique em OK para retornar à janela Nova Conexão e clique em Salvar. Figura 12. teste de conexão. Fonte: microsoft (2017). 54 UNIDADE III │ MoDElAgEM Do MoNgoDB usar o mongoChef para criar um banco de dados, uma coleção e documentos Para criar um banco de dados, uma coleção e documentos usando o MongoChef, execute as etapas a seguir. 1. No Gerenciador de Conexões, realce a conexão e clique em Conectar. Figura 13. gerenciador de conexões. Fonte: microsoft (2017). 2. Clique com o botão direito do mouse e escolha Adicionar Banco de Dados. Forneça um nome de banco de dados e clique em OK. Figura 14. adicionando uma nova base de dados. Fonte: microsoft (2017). 55 ModelageM do MongodB │ UnIdade III 3. Clique com o botão direito do mouse no banco de dados e escolha Adicionar Coleção. Forneça um nome de coleção e clique em Criar. Figura 15. adicionando coleções. Fonte: microsoft (2017). 4. Clique no item de menu Coleção e clique em Adicionar Documento. Figura 16. adicionando documentos. Fonte: microsoft (2017). 56 UNIDADE III │ MoDElAgEM Do MoNgoDB 5. Na caixa de diálogo Adicionar Documento, cole o conteúdo a seguir e clique em Adicionar Documento. { “_id”: “AndersenFamily”, “lastName”: “Andersen”, “parents”: [ { “firstName”: “Thomas” }, { “firstName”: “Mary Kay”} ], “children”: [ { “firstName”: “Henriette Thaulow”, “gender”: “female”, “grade”: 5, “pets”: [{ “givenName”: “Fluffy” }] } ], “address”: { “state”: “WA”, “county”: “King”, “city”: “seattle” }, “isRegistered”: true } Adicione outro documento, dessa vez com o conteúdo a seguir. { “_id”: “WakefieldFamily”, “parents”: [ 57 ModelageM do MongodB │ UnIdade III { “familyName”: “Wakefield”, “givenName”: “Robin” }, { “familyName”: “Miller”, “givenName”: “Ben” } ], “children”: [ { “familyName”: “Merriam”, “givenName”: “Jesse”, “gender”: “female”, “grade”: 1, “pets”: [ { “givenName”: “Goofy” }, { “givenName”: “Shadow” } ] }, { “familyName”: “Miller”, “givenName”: “Lisa”, “gender”: “female”, “grade”: 8 } ], “address”: { “state”: “NY”, “county”: “Manhattan”, “city”: “NY” }, “isRegistered”: false } 58 UNIDADE III │ MoDElAgEM Do MoNgoDB 6. Execute uma consulta de exemplo. Por exemplo, procure famílias com o sobrenome ‘Andersen’ e retorne os campos de estado e país. Figura 17. executando uma consulta. Fonte: microsoft (2017). Conectar um aplicativo do mongodB ao Azure Cosmos dB Para conectar seu aplicativo do MongoDB a uma conta do Azure Cosmos DB usando uma cadeia de conexão do MongoDB você pode usar um banco de dados do Azure Cosmos DB como o armazenamento de dados para seu aplicativo MongoDB. E como recuperar informações da cadeia de conexão? Seguiremos dois passos: 1. O método de início rápido: para uso com drivers do .NET, Node.js, Shell do MongoDB, Java e Python 2. O método de cadeia de conexão personalizada: para uso com outros drivers Porém para tal, são necessários alguns prerrequisitos: » Uma conta do Azure. » Uma conta do Azure Cosmos DB. 59 ModelageM do MongodB │ UnIdade III Vejamos como obter a cadeia de conexão do MongoDB usando o início rápido: 1. Em um navegador da Internet, entre no Portal do Azure. 2. Na folha (aba) Azure Cosmos DB, selecione a API da conta MongoDB. 3. No painel esquerdo da folha (aba) da conta, clique em Início rápido. 4. Escolha sua plataforma (.NET, Node.js, MongoDB Shell, Java, Python). 5. Copie e cole o trecho de código no seu aplicativo MongoDB. Figura 18. escolhendo api mongodB. Fonte: microsoft (2017). Vejamos como obter a cadeia de conexão do MongoDB para personalização: 1. Em um navegador da Internet, entre no Portal do Azure. 2. Na folha (aba) Azure Cosmos DB, selecione a API da conta MongoDB. 60 UNIDADE III │ MoDElAgEM Do MoNgoDB 3. No painel esquerdo da folha (aba) de conta, clique em Cadeia de Conexão (Connection String). 4. A folha (aba) de Cadeia de Conexão é aberta. Ela tem todas as informações necessárias para se conectar a conta usando um driver para MongoDB, incluindo uma cadeia de conexão pré-construída. Figura 19. configurando conexões. Fonte: microsoft (2017). 61 CAPítulo 3 E o que esperar do mongodB? fazendo um overview! Conforme foi visto, o MongoDB é um banco de dados orientado a documentos que utiliza o conceito de dados e documentos autocontidos e autodescritivos, e isso implica que o documento em si já define como ele deve ser apresentado e qual é o significado dos dados armazenados na sua estrutura. Devemos lembrar que os bancos de dados orientados nos documentos têm como característica conter todas as informações importantes em um único documento, ser livre de esquemas, possuir identificadores únicos universais (UUID), possibilitar a consulta de documentos por meio de métodos avançados de agrupamento e filtragem (MapReduce) e também permitir redundância e inconsistência. Para Kyle (2011), esses bancos de dados também são chamados de Bancos NoSQL (Not Only SQL). Esse termo NoSQL é devido à ausência do SQL, mas esse tipo de banco de dados não se resume apenas a isso, portanto o termo não é o mais correto para esse novo tipo de banco de dados. No entanto, ele é aceito porque o termo já se popularizou na comunidade. Alguns chegaram a defender o termo NoREL (Not Relational), mas diferente do anterior este não foi muito aceito. De forma resumida, esse tipo de banco de dados não traz consigo as ideias do modelo relacional e nem a linguagem SQL.Uma diferença fundamental entre os dois modelos surge quando precisamos criar relacionamentos nos bancos de dados relacionais, diferente dos bancos orientados a documentos que não fornecem encadeamento entre documentos, o que mantém seu design sem esquemas. Dessa forma, ao invés de armazenar dados relacionados em uma área de armazenamento separado, os bancos de dados de documentos integram esses dados ao próprio documento. Contudo, ainda assim é possível armazenar dados relacionados de forma separada, isso pode ser feito usando uma coleção separada, porém, é preciso tomar cuidado com isso visto que os ganhos de desempenhos podem ser perdidos. Além do MongoDB, existem diversos banco de dados NoSQL hoje, são eles: DynamoDB, MarkLogic, CouchDB, entre outros. Nesta seção abordaremos alguns. Suas características O MongoDB tem como característica ser código-fonte aberto licenciado pela GNU AGPL (Affero General Public License), possuindo alta performance, não possuir esquemas, 62 UNIDADE III │ MoDElAgEM Do MoNgoDB ser escrito em C++, multiplataforma e ser formado por um conjunto de aplicativos JSON. Apesar do projeto MongoDB ter iniciado em 2007, o banco de dados somente foi concluído em 2009, lançando assim a primeira versão do MongoDB. Diversas linguagens e plataformas já possuem drivers para o MongoDB, entre elas destacam-se: C, C#, C++, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby e Scala. Além disso, o MongoDB possui binários para diversas plataformas como Windows, Mac OS X, Linux e Solaris. Entre as empresas que já utilizam o MongoDB destacam-se: Globo.com, SourceForge, FourSquare, MailBox (serviço de e-mail do Dropbox), LinkedIn, SAP, MTV, Pearson Education, e muitos outros. Uma lista com todos os serviços em ambiente de produção que estão utilizando o MongoDB pode ser encontrado em: <http://www. mongodb.com/>. Vantagens Utilizando MongoDB temos uma melhor performance, visto que uma única consulta retorna tudo o que precisamos saber sobre o documento. Os bancos de dados NoSQL apresentam vantagens sobre os outros quando precisamos de escalabilidade, flexibilidade, manipulação de quantidade massiva de dados, bom desempenho e facilidade para consultas. O MongoDB possui consultas bastante simples de serem realizadas, observando quenão existem transações e joins. As consultas são mais fáceis de escrever e mais fáceis de ajustar. Como a linguagem de consulta SQL é fácil de ser convertida para MongoDB temos uma maior facilidade para migração de organizações que atualmente usam bancos de dados relacionais. Por fim, o MongoDB também possui a funcionalidade chamada GridFS que é responsável por armazenar arquivos de grandes dimensões. Isso significa que vídeos, arquivos etc., podem ser armazenados diretamente no banco de dados, diferente do modelo relacional que tínhamos que armazenar tudo no Filesystem e disponibilizar apenas uma referência para esses arquivos no banco de dados. O tempo de resposta desses arquivos armazenados no MongoDB é comparado ao tempo de resposta dos arquivos em Filesystems. 63 ModelageM do MongodB │ UnIdade III desvantagens Uma desvantagem é quando queremos alterar todos os registros relacionados a uma unidade semântica, nesse caso é preciso tratar um a um. (KYLE, 2011). Uma pergunta a ser respondida ainda é a dúvida que todos os usuários possuem em relação ao suporte do MongoDB que todas as grandes empresas e projetos de alto valor necessitam. Até que ponto o MongoDB oferece esse suporte necessário? Outro ponto é em relação à disponibilidade do serviço. Essas e outras perguntas serão respondidas ao longo do tempo, o fato é que muitas empresas de grande porte tem utilizado em projetos de complexidade média, uma escolha natural devido ao pequeno tempo que essa nova tecnologia está no mercado e os resultados têm sido muito satisfatórios. outras plataformas noSql marklogic MarkLogic é uma empresa baseada no Vale do Silício, fundada em 2001, que cria o que ela define como “o único banco de dados NoSQL empresarial” no mercado. Começando com as suas raízes na base de dados XML, a empresa alavancou mais de uma década da experiência no desenvolvimento de soluções para dados não estruturados, levando-a a ganhar o rótulo de “empresa NoSQL”. MarkLogic define sua solução como um servidor de banco de dados focado em documento, transacional, focado em pesquisa, estruturado, sem esquemas, programático, de alto desempenho, e clusterizado. Ela é amplamente implantada no mercado editorial, no governo, nas finanças e em outros setores, com centenas de sistemas de larga escala na produção. Foi usado como o principal banco de dados para os Jogos Olímpicos de Verão de 2012 em Londres, bem como pela Administração Federal de Aviação dos Estados Unidos, o que sinaliza a merecida reputação do MarkLogic como uma plataforma altamente escalável, robusta e segura para as soluções de Big Data. CouchdB Uma recente rodada de financiamento de US$ 60 milhões fez do Couchbase um dos bancos de dados NoSQL emergentes e recém-populares no mercado hoje, rivalizando com MongoDB. Uma das principais áreas em que o Couchbase inovou foi no fornecimento de escalabilidade simplificada e desempenho para aplicativos interativos na interseção do que ele chama de “três megatendências inter-relacionadas – Big Data, Big Users e Cloud Computing”. O Cloudbase também pressionou o gerenciamento de 64 UNIDADE III │ MoDElAgEM Do MoNgoDB dados de ofertas móveis, permitindo aos usuários sincronizar facilmente dados entre dispositivos móveis e nuvem. A tecnologia de código aberto do Couchbase está disponível em duas versões: uma edição comunitária que vem sem correções de bugs recentes, e a estável Enterprise Edition, para uso comercial. Os builds do Couchbase estão disponíveis para Ubuntu, Red Hat, plataformas Windows e Mac OS X. dynamodB O DynamoDB da Amazon é um serviço de banco de dados NoSQL totalmente proprietário que utiliza a imensa infraestrutura de computação em nuvem da Amazon. Ele é o ápice de 15 anos de experiência na construção de bancos de dados não relacionais para as próprias necessidades internas da Amazon e representa a versão baseada em nuvem dessa tecnologia desenvolvida para clientes externos. Com o DynamoDB, tudo que você tem a fazer é criar a tabela de banco de dados, e o serviço faz o resto. À medida que você escalona, não há necessidade para provisionamento de hardware ou de software, configurações e setups, aplicação de patches de software, operação de um cluster de banco de dados distribuído ou a necessidade de dividir os dados pelas várias instâncias. DynamoDB é o único que funciona com base no princípio da “taxa de transferência” em vez de armazenamento. Com base nesse modelo, o serviço Amazon DynamoDB irá garantir que aloca os recursos da máquina para atender às suas necessidades de taxa de transferência, juntamente com a garantia de um desempenho consistente, de baixa latência. O modelo do Amazon de “pagar apenas pelo que usa”, sem taxa mínima e escalabilidade de baixo custo, torna-o uma maneira barata e acessível para as empresas aproveitarem os últimos avanços em desempenho NoSQL. 65 unidAdE iVAtiVidAdE PrátiCA CAPítulo 1 Vamos que vamos! Antes de iniciarmos a prática, é interessante buscarmos uns conceitos complementares ao que já foi visto nesse material, vamos lá! mongodB O MongoDB consiste em dois serviços: mongod e mongos. O mongos é usado para autosharding. Sharding é uma distribuição física de dados em nós distintos, utilizando quando é necessário o balanceamento de carga. O mongod é o servidor do banco de dados. É altamente recomendável que mongod rode em um sistema operacional de 64 bits, já que o tamanho máximo para um banco de dados na arquitetura de 32 bits é 2 gigabytes. Além do servidor, o MongoDB possui um serviço de cliente de shell padrão, o mongos, que é usado para uma conexão ao servidor pela porta 27017, mas além deste cliente, estãodisponíveis em vários drivers oficiais para linguagens como PHP, JAVA, C, C ++, entre outros. O servidor do MongoDB pode armazenar um ou mais bancos de dados diferentes, em que cada base de dados é composta por uma ou mais coleções e cada coleção é possível ter um ou mais documentos. Esses documentos são estruturados como documentos JSON e armazenados no formato BSON (JSON binário). JSON (JavaScript Object Notation) é uma estrutura de dados criada em javascript, que consiste no padrão atributo/valor, semelhante aos arrays. O JSON pode ser uma alternativa ao XML, no qual às vezes se destaca sem qualquer dúvida em relação à velocidade de leitura dos dados armazenados nele. 66 UNIDADE IV │ AtIVIDADE PrátIcA Exemplo de estrutura JSON: {“Nome”: “joão”, “idade”: “20”}, {“nome”: “maria”, “idade”: “22”}. No MongoDB, não há recursos para transações e também joins, que são usados em bancos de dados relacionais, assim sendo, os desenvolvedores devem implementá-lo na aplicação quando for realmente necessário. instalação e configuração Entre outros sistemas de gerenciamento de banco de dados orientados ao NoSQL, o MongoDB possui uma certa vantagem em relação à simplicidade da instalação. A instalação do MongoDB para Windows é centralizada, o protótipo será desenvolvido em uma plataforma direcionada a este sistema operacional. Primeiro, você deve acessar uma página de download no site oficial do software: <http:// www.mongodb.org/downloads>. É necessário escolher o elemento correto, de acordo com o sistema operacional e com o usuário utilizado. O site oferece tutoriais em inglês para instalar em outros sistemas operacionais. Após o download do arquivo, no caso do MongoDB para Windows, basta executar o arquivo recebido para concluir a instalação. Os arquivos MongoDB serão colocados em um diretório em “C:”. Por padrão, bancos, documentos e coleções são armazenados no arquivo C:\data\db, então você precisa criar esses diretórios se eles não existirem. No entanto, pode ser configurado para que os dados sejam armazenados em outro local de sua preferência. Para isso, é sempre necessário inicializar o servidor através de comando digitando o seguinte comando: C:\mongodb\bin\mongod.exe --dbpath c:\novodir\db\data Se você não tiver problemas para deixar o diretório inicial como coleções/documentos na raiz “C:”, basta executar o arquivo “mongod.exe” encontrado no diretório “bin”, dentro do diretório inicial do MongoDB criado em “C:”. É sempre necessário rodar o executável mongod.exe para deixar o servidor on-line, ao fechá-lo, o servidor se desconecta automaticamente, ou seja, fica off-line. Na figura 20, é possível verificar a tela inicial ao executar o mongod.exe do servidor. 67 AtividAde PráticA │ UNidAde iv Figura 20. tela servidor mongodB. Fonte: mongodB (2016). manipulação de dados Após executar o arquivo do servidor, você pode abrir o cliente do MongoDB. Vá ao diretório “bin” e execute o arquivo mongo.exe. Figura 21. cliente mongodB. Fonte: mongodB (2016). Na figura 21 vemos a tela exibida ao executar o cliente mongo.exe. Pode-se notar que somos automaticamente conectados ao banco de dados padrão nomeado “test”. 68 UNIDADE IV │ AtIVIDADE PrátIcA No MongoDB, não é necessário criar uma coleção para começarmos a inserir documentos e informações. Isto é feito automaticamente ao inserir o primeiro registro. Nas páginas seguintes, executaremos alguns comandos para a manipulação de dados. Então, sugiro que você acompanhe estes exemplos na prática, rodando tudo em sua máquina. Supondo que vamos criar o banco de dados “Faculdade”, e a coleção “Cursos” (comparando com um banco de dados relacional, “Cursos” é o equivalente a uma tabela), ao invés de executar um comando para criar a tabela, já podemos executar o comando de inserção de registros e o documento é criado automaticamente: Figura 22. cliente mongodB. Fonte: mongodB (2016). O comando “use Faculdade” acessa o banco de dados “Faculdade” ou cria um banco de dados caso não exista nenhum outro banco com este nome, indicando também que os próximos comandos são referentes a esta base de dados. Figura 23. comando inserir. Fonte: mongodB (2016). 69 AtividAde PráticA │ UNidAde iv A figura 23 mostra os próximos comandos para inserir um novo registro na coleção “Cursos”. No caso, inserimos o curso “Ciências da Computação”. O comando foi montado com um array chamado “novo_curso” utilizando a sintaxe em JSON (em que o índice “nome” é equivalente a uma coluna de um banco de dados relacional), seguido do comando “db.cursos.save(novo_curso)”, no qual “cursos” será o nome da coleção e o parâmetro é a variável que armazena o registro a ser inserido. Nota-se que não foi feito nenhum comando para criar a coleção, apenas foi executado o comando de inserção. Figura 24. insert direto. Fonte: mongodB (2016). A figura 24 demonstra outra maneira de fazer a inserção, sem utilizar a variável de apoio “novo_curso”, passando como parâmetro para a função “save()” diretamente o array JSON de dados a ser inserido. Figura 25. consultar registros. Fonte: mongodB (2016). 70 UNIDADE IV │ AtIVIDADE PrátIcA Na figura 25, é possível ver o resultado do comando “db.cursos.find()”, que consulta todos os documentos (ou registros) da coleção “cursos”. Note que é criado automaticamente um atributo chamado “_id”. Este atributo cria um índice único para os registros, para que seja possível a edição ou exclusão de um registro específico. É basicamente um campo que armazena a hora da criação do registro e codifica tal dado em BSON. Para decodificar este dado, o MongoDB disponibiliza uma função chamada “getTimestamp()”, que retornará um objeto do tipo data como no exemplo: “ISODate(“2012-10-17T20:46:22Z”)”. Figura 26. remover. Fonte: mongodB (2016). Na figura 26, vemos o comando de exclusão “db.cursos.remove()”. Passamos por parâmetro o que seria o atributo where da linguagem SQL. Neste exemplo estamos excluindo todos os registros cujo atributo nome seja igual a “análise de sistemas”. Figura 27. remover documento pelo atributo id. Fonte: mongodB (2016). 71 AtividAde PráticA │ UNidAde iv Na figura 27, tentamos excluir um documento pelo seu “_id”. Podemos observar o retorno “{“nRemoved” : 0}”, que indica que nenhum item foi excluído. Isto porque, como foi dito anteriormente, o índice “_id” armazena um objeto contendo a data em que o registro foi inserido, portanto para excluir o registro equivalente, temos que passar um objeto como parâmetro, como demonstrado na figura 26. Figura 28. remover atributo por “id” – ex. 2. Fonte: mongodB (2016). Na figura 28 passamos um “ObjetcId” como parâmetro e o retorno apontou para um registro excluído. Para apagar todos os registros de uma coleção, usamos o comando “db.cursos.drop()”. Figura 29. exemplo de atualização. Fonte: mongodB (2016). Na figura 29, inserimos dois cursos, “Música” e “Administração”. Em seguida exibimos na tela. O comando “db.cursos.update()” atualizou o registro que continha o nome “administracao” para “administração”. Nos bancos de dados NoSQL não existem relacionamentos e caso seja necessário fazer uma relação entre os documentos (o que sairia um pouco do contexto de estar utilizando 72 UNIDADE IV │ AtIVIDADE PrátIcA um banco de dados não relacional), o usuário pode definir por exemplo, na coleção matéria, o índice “curso_id” e armazenar o valor do índice “_id” da coleção cursos, porém a consistência entre as tabelas terá de ser controlada por meio da programação. Em relações “muitos para muitos” ou “many to many”, é necessário criar um novo índice em ambas as coleções que irão se relacionar, contendo um array com os valores relacionados, como mostra o exemplo a seguir. Na figura 30, é exibida a lista de matérias sem a relação com alunos matriculados. Figura 30. listando documentos salvos na coleção matéria. Fonte: mongodB (2016). Será feito um update no documento desejado, adicionando um índicecom os alunos matriculados na devida disciplina, como veremos na figura 31. Figura 31. criando “relação” de matérias com alunos. Fonte: mongodB (2016). Na figura 32, temos um exemplo de consulta neste índice que contém os alunos relacionados. Figura 32. consulta no índice formado por um array. Fonte: mongodB (2016). 73 AtividAde PráticA │ UNidAde iv No exemplo acima, foi realizado um update em outro documento da coleção matérias e exibidos os dados logo a seguir com o comando “db.materias.find()”. Para consultar, por exemplo, as matérias em que o aluno “Matheus” está matriculado, foi usado o comando “db.materias.find({“alunos” : “matheus”})”.Para que as mesmas consultas pudessem ser executadas na coleção alunos, seria necessário criar o índice “matérias” na coleção alunos assim como fizemos na coleção matérias para relacionar os alunos. Existem muitos outros comandos para consultas parecidos com comandos utilizados em SQL e podem ser encontrados no manual on-line do MongoDB. desenvolvimento de um protótipo Para demonstrar o desenvolvimento utilizando o MongoDB como gerenciamento de banco de dados, será desenvolvido um protótipo utilizando a linguagem web PHP. O protótipo consistirá em um cadastro de álbuns de música e além de uma versão utilizando o MongoDB, será desenvolvida uma versão utilizando PostgreSQL como banco de dados relacional, para fins de comparação de código. O protótipo se baseará em um formulário para o cadastro de álbuns no qual o usuário deverá digitar as músicas pertencentes ao álbum, o artista, os gêneros e a gravadora responsável, além de uma tela para consulta desses dados. A figura 33 mostra o formulário principal da aplicação. Os campos “Faixa” serão salvos na tabela “músicas” enquanto o restante das informações irá para a tabela “Álbum”. Figura 33. Formulário de cadastro. Fonte: nascimento (2014). 74 UNIDADE IV │ AtIVIDADE PrátIcA Figura 34. tela de consulta aos dados inseridos Fonte: nascimento (2014). modelagem dos dados Para a criação do banco de dados relacional, utilizando o PostgreSQL, foi feita a seguinte modelagem: Figura 35. modelagem do Banco de dados relacional. Fonte: nascimento (2014). Na tabela álbum, será realizado o relacionamento com as tabelas: gravadora, artista e gênero por uma chave estrangeira para cada uma dessas tabelas. Um álbum possuirá diversas músicas, por isso foi optado por deixar na tabela Músicas a chave estrangeira que relacionará o álbum a qual cada música pertence. Conectando PHP ao mongodB Para conectar o PHP ao MongoDB foi necessária a instalação de um driver. O link para o download do driver está disponível em “http://docs.mongodb.org/ecosystem/ 75 AtividAde PráticA │ UNidAde iv drivers/php”. Após o download, é necessário copiar o arquivo no diretório “ext” do servidor PHP e também acessar o arquivo de configuração “php.ini”, e acrescentar a linha “extension=php_mongo.dll”. Para ter certeza que o PHP consegue se conectar ao MongoDB, basta criar um arquivo PHP e utilizar o comando “phpinfo()”, no qual serão exibidos todos os dados do servidor e as extensões instaladas. Comparações no desenvolvimento do protótipo Para que a aplicação se conecte ao banco de dados relacional, no caso o PostgreSQL, é necessário criar um arquivo de configuração passando por parâmetro o host, porta, usuário e senha do banco de dados. Quando utilizamos o MongoDB, apenas é necessário inicializar a conexão, com a classe do PHP MongoClient, como vemos no exemplo abaixo: Figura 36. iniciando uma conexão do pHp com o mongodB. Fonte: nascimento (2014). A seguir, selecionaremos o banco de dados do MongoDB que desejamos manipular: Figura 37. definindo o Banco de dados para manipulação. Fonte: nascimento (2014). Para criar uma nova coleção, utilizamos o seguinte comando: Figura 38. criando nova coleção de documentos. Fonte: nascimento (2014). Como podemos notar, o PHP tem classes prontas para manipular os dados com o MongoDB, o que torna mais fáceis as operações fundamentais: inserção, atualização, deleção e consulta. 76 UNIDADE IV │ AtIVIDADE PrátIcA Como exemplo, vamos analisar o formulário do protótipo (figura 33). Quando o botão “salvar” do formulário é pressionado, a aplicação executará um código em PHP. A seguinte query será montada por meio de uma string utilizando código PHP para que os dados do formulário sejam inseridos na tabela do banco de dados relacional: Figura 39. Query para postgresQl. Fonte: nascimento (2014). Para executar a query acima utilizando o PostgreSQL, o PHP possui um driver com classes para o uso deste banco de dados, assim como o MongoDB. Veja um exemplo de comando para a execução da query: Figura 40. exemplo de comando para execução da query. Fonte: nascimento (2014). O primeiro parâmetro é uma variável ($conexao) que armazena os dados da conexão com o banco de dados e a segunda ($sql_insert) é a query a ser executada. Para realizar a mesma operação utilizando o MongoDB, é necessário criar um array utilizando PHP para passar como parâmetro para a função de inserção. Para melhor entendimento, vejamos o trecho de código a seguir: Figura 41. configuração para conexão pHp ao postgresQl. Fonte: nascimento (2014). 77 AtividAde PráticA │ UNidAde iv A variável $conexao armazena o retorno da função “pg_connect”, e os parâmetros são os dados para acesso ao banco de dados. Existem frameworks que facilitam a criação das querys, mas como o foco deste estudo é o MongoDB, foi optado pela utilização do código PHP “puro”, até mesmo pois o MongoDB também possui módulos desenvolvidos na maioria dos frameworks para PHP. Figura 42. array parâmetro para inserção no mongodB. Fonte: nascimento (2014). Note que temos um índice “musicas”. Diferentemente do banco de dados relacional, o MongoDB não possui a operação JOIN, mas podemos salvar em um documento um array como valor de uma coluna, podendo assim “substituir” a tabela “músicas” do modelo relacional, e vincular a um álbum um array de músicas. Além disso, é necessário alterar os valores que o formulário passará nos casos de gênero, artista e gravadora. No modelo relacional, o valor passado ao PHP para montar a query de inserção é o valor da chave primária de cada uma dessas tabelas para que seja criado o relacionamento com a tabela álbum. No MongoDB, por não haver JOINS e relacionamentos, foi alterado o valor enviado pelo formulário para o campo nome, gravando no nosso documento uma string. Se caso o usuário desejasse criar novas colunas para a tabela “Gravadora”, por exemplo, a maneira mais apropriada de reproduzir este caso para o MongoDB seria criar um novo índice contendo um array com as chaves equivalentes às colunas desejadas e armazenar em um índice “gravadoras”, assim como foi feito para o caso das músicas. Para outras operações como consultar, editar e remover, o processo para o desenvolvimento em PHP seria idêntico ao comando de insert, em que será necessário criar uma string e executá-la com a classe do PostgreSQL. 78 UNIDADE IV │ AtIVIDADE PrátIcA Para realizar uma atualização em algum documento de uma coleção, utilizamos em PHP o código a seguir: Figura 43. update com mongodB. Fonte: nascimento (2014). O primeiro parâmetro para a função update é o equivalente a expressão where da linguagem SQL, no qual indicamos a condição para que o documento seja atualizado. O segundo parâmetro é um array contendo as informações atualizadas, assim como foi feito para a inserção. O comando para exclusão é idêntico ao de atualização: Figura 44. remover registro com mongodB. Fonte: nascimento (2014). Para realizar uma consulta aos documentos de determinada coleção, utilizamos a função “find()”. Caso seja necessário um filtro, basta passar um parâmetro de comparação, assim como fazemos nas operações update e remove. Figura 45. exemplos de consulta com mongodB. Fonte: nascimento (2014). Existem outras funções para consulta,como “limit()”, que limitará o número de documentos retornados. O foco do estudo não era comparação de desempenho, portanto, não foram utilizados softwares para medir o desempenho das consultas. 79 CAPítulo 2 gridfS! Digamos que temos uma aplicação hospitalar média que faz a gravação dos dados dos seus pacientes. Assim como a lógica de computação, cada pessoa tem uma representação em um conjunto de metadados (nome, sobrenome, endereço, CPF, entre outros) e outros arquivos, como por exemplo, os resultados da consulta ou exame. Com isso já notamos que é gerado um grande volume de dados. E uma decisão importante é necessária a se tomar, manter todos os dados em um único gerenciador de banco de dados? Ou jogar essa responsabilidade ao sistema operacional, que irá gerenciar esses grandes arquivos? O MongoDB tem a possibilidade de reunir grandes volumes de dados apresentando características bem diversas (imagens, vídeos, entre outros). Pasmem! A grande vantagem é que teríamos uma administração bastante simples. Não estaríamos sujeitos às limitações do sistema operacional no que tange à gerência de milhões de arquivos e ainda poderíamos implementar técnicas sofisticadas, tais como particionamento e replicação (DataScience, 2016). E onde usamos o recurso GridFS? Exatamente agora! Para lidar com grandes arquivos, o MongoDB possui esse recurso denominado de GridFS, que é utilizado quando queremos armazenar arquivos com tamanho superior a 16 MB (DataScience, 2016). Em tese, podemos gravar arquivos menores diretamente em campos do tipo binário (binary data), porém, neste caso, devemos criar pequenos programas (escrito em alguma linguagem de programação, tal como Python, C++, PHP, NodeJS etc.). Vale lembrar que um banco de dados MongoDB é feito por diversas coleções e estas por conjuntos de documentos, que podem ter suas estruturas diferentes. Ainda que façamos a interação utilizando estruturas JSON, o MongoDB armazena internamente os dados utilizando um padrão proprietário denominado BSON (binary JSON). Assim, tudo é armazenado de forma binária e não apenas grandes arquivos. Vamos analisar agora um caso prático. Digamos que seja necessário armazenar em um banco de dados MongoDB uma relação de músicas (arquivos mp3): 80 UNIDADE IV │ AtIVIDADE PrátIcA Figura 46. relação de músicas. Fonte: datascience (2016). Poderíamos reunir algumas músicas criando uma espécie de playlist: copy /b AllAboutThatBass.mp3 + AmIWrong.mp3 + Budapest.mp3 + NoWayNo.mp3 + TheWeeknd.mp3 Trilha.mp3 Vamos checar agora o tamanho do arquivo resultante: Figura 47. playlist de músicas: trilha.mp3. Fonte: datascience (2016). Assumindo que tenhamos um servidor MongoDB disponível, o comando a seguir faria a carga do arquivo Trilha.mp3: 81 AtividAde PráticA │ UNidAde iv Figura 48. carga do arquivo trilha.mp3. Fonte: datascience (2016). Observações: » O arquivo será carregado no banco de dados chamado Musicas (observe a opção -d). Caso este banco não exista, será criado; » O utilitário mongofiles trabalha com três tipos de argumentos: opções (no exemplo: --host e -d); comando (por exemplo, put) e; nome de arquivo (mp3). Caso o arquivo carregado possua mais que 16 MB, internamente ele será dividido em pequenas porções denominadas chunks. No banco de dados de destino serão criadas duas coleções: fs.files e fs.chunks. A primeira terá um documento para cada arquivo importado, enquanto que a segunda comportará a relação de chunks. Vale notar a ocorrência de uma espécie de relacionamentos entre as coleções, já que o conteúdo do atributo _id da coleção mãe será repetido em tantos documentos quanto chunks existirem representados na coleção filha (atributo files_id). Podemos mostrar os arquivos e seus respectivos chunks realizando uma junção entre as coleções. No MongoDB, consultas desta natureza utilizam agregação. Por exemplo: db.fs.files.aggregate ( [ { $lookup: { from: “fs.chunks”, localField: “_id”, foreignField: “files_id”, as: “relacionado” } } ] ) 82 UNIDADE IV │ AtIVIDADE PrátIcA Observações: » O método aggregate recebe uma lista de operadores, tais como: $group, $match ou $sort. No exemplo acima estamos utilizando apenas o operador $lookup; » Para realizar a junção, precisamos informar a coleção filha (chunks), o atributo na coleção mãe atuando como chave primária (_id), o atributo na coleção filha atuando como chave estrangeira (files_id) e um nome para o vetor que conterá a relação de documentos filhos (relacionado). Caso o vetor seja muito extenso, podemos receber o seguinte erro: » assert: command failed: { “ok” : 0, “errmsg” : “Total size of documents in fs.chunks matching { files_id: { $eq: ObjectId(’57b5f49412042f328c2ce b92′) } } exceeds maximum document size”, “code” : 4568} : aggregate failed _getErrorWithCode@src/mongo/shell/utils.js:23:13doassert@ src/mongo/shell/assert.js:13:14assert.commandWorked@src/mongo/ shell/assert.js:264:5 DBCollection.prototype.aggregate@src/mongo/ shell/collection.js:1215:5@(shell):1:1 Para contornar esse problema, precisamos desmembrar o vetor em vários documentos. Isto pode ser obtido utilizando outro operador de agregação, o $unwind: db.fs.files.aggregate ( [ { $lookup: { from: “fs.chunks”, localField: “_id”, foreignField: “files_id”, as: “relacionado” } }, {“$unwind”: 83 AtividAde PráticA │ UNidAde iv {“path”: “$relacionado”, “preserveNullAndEmptyArrays”: true } } ] ) Perceba como tivemos que mencionar o vetor no campo path. Executando a consulta acima em um ambiente gráfico como o Robomongo3, teríamos a seguinte saída: Figura 49. saída de execução no robomongo. Fonte: datascience (2016). O exemplo acima mostra tantos documentos quanto chunks houver. A única diferença entre os documentos mostrados está na última coluna, exibindo um subdocumento com os quatro campos da coleção fs.chunks. 3 O Robomongo é um software multiplaforma para gerenciamento de bancos de dados MongoDB, podendo ser instalado em Windows, Mac e Linux. 84 UNIDADE IV │ AtIVIDADE PrátIcA Mesmo o arquivo tendo um tamanho inferior a 16 MB, ainda assim podemos utilizar o GridFS. Nestes casos, entretanto, nenhum documento será criado na coleção fs.chunks. Mas se o cenário mudar e desejarmos adicionar mais um arquivo mp3 ao nosso banco de dados musical, porém desta vez sem fazer parte de uma playlist, devemos executar o comando: mongofiles --host localhost -d Musicas put Photograph.mp3 O comando a seguir lista os arquivos carregados: Figura 50. listagem dos arquivos carregados. Fonte: datascience (2016). Poderíamos, eventualmente, recuperar um arquivo carregado e trazê-lo novamente aos cuidados do sistema operacional. Para isto, precisamos do comando get: mongofiles --host localhost --local P.mp3 -d Musicas get Photograph.mp3 85 referências Data Science Academy. Publicado em 2016. Disponível em: <http:// datascienceacademy.com.br/blog/gridfs-gerenciando-big-data-em-mongodb/>. Acessado em: 15 de janeiro 2018. KORTH, Henry F., SILBERSCHATZ, Abraham. Sistema de Banco de Dados. 2. ed. rev. São Paulo: Makron Books, 1995. KYLE; B. MongoDB. In: Action. Manning, 2011. MICROSOFT. BD Cosmos do Azure. Disponível em: <https://azure.microsoft.com/ pt-br/services/cosmos-db/>. Acessado em: 30 de novembro de 2017. MONGODB. Explore o MongoDB. Disponível em: <http://www.ibm.com/ developerworks/br/library/os-mongodb4>. Acessado em: 27 de outubro de 2017. NASCIMENTO, Bellio. MongoDB: Um estudo teórico-prático do conceito de banco de dados NoSQL, Faculdade Campo Limpo Paulista, 2014. PEARSON. Sams Teach Yourself NoSQL with MongoDB in 24 Hours. Disponível em: <http://ptgmedia.pearsoncmg.com/imprint_downloads/informit/ learninglabs/9780133902990/ch02.html>. Acessado em: 26 de novembro de 2017. SANTOS, José, I. Plataforma para Gestão e Monitorização de Eventos. Dissertação de Mestrado. Universidade do Algarve, Portugal. 2014. _ftnref1