Baixe o app para aproveitar ainda mais
Prévia do material em texto
05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 1/48 BANCO DE DADOS APLICADO A BIG DATABANCO DE DADOS APLICADO A BIG DATA DESENVOLVIMENTO DEDESENVOLVIMENTO DE APLICAÇÕES COM BANCOS DEAPLICAÇÕES COM BANCOS DE DADOS NÃO RELACIONAISDADOS NÃO RELACIONAIS (NOSQL)(NOSQL) Autor: Me. Everton Gomede Reviso r : I sa be l Cr ist in a S iqu e ira da S i lva INICIAR 1.00 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 2/48 introduçãoIntrodução O shell JavaScript do MongoDB torna mais fácil trabalhar com os dados e ter uma noção tangível de documentos, coleções e linguagem de consulta do banco de dados. Pense neste estudo como uma introdução prática ao MongoDB. Você começará baixando, instalando e colocando o shell em funcionamento. Então, você verá como o JavaScript (especi�camente em JSON) representa documentos e aprenderá como inserir esses documentos em uma coleção dentro do MongoDB. Para veri�car essas inserções, você irá praticar as consultas a tais coleções. Então, depois disso, vamos aprender como realizar as atualizações. Por �m, executaremos as operações CRUD, aprendendo a remover dados e recuperar coleções. Você se bene�ciará mais com esta unidade se seguir os exemplos, mas, para fazer isso, você precisará ter o MongoDB instalado em seu sistema, como veremos a seguir. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 3/48 Para iniciar o trabalho com o MongDB, primeiro precisamos realizar seu download, instalação e con�guração. Vamos baixar a última versão disponível e realizar sua instalação sob o sistema operacional Windows. Vale ressaltar que a versão do sistema operacional deve ser igual ou acima do Windows 10. Depois disso, você obterá acesso a uma interface, conforme mostrada na Figura 2.1. Conceitos de OperaçõesConceitos de Operações CRUD em Bancos deCRUD em Bancos de Dados Não RelacionaisDados Não Relacionais saiba maisSaiba mais Para realizar o download do MongoDB, vá para a sua página o�cial, selecione a opção On-premises, clique em download e o aguarde ser �nalizado. Fonte: MongoDB (2020). Para obter mais informações, acesse o link a seguir. ACESSAR https://www.mongodb.com/try/download/community 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 4/48 Depois de realizado o download, inicie a instalação do MongoDB. Para isso, utilizamos uma versão do sistema operacional Windows 10. Durante o download, você pode optar pelo sistema operacional que deseja utilizar, por exemplo o Linux (Ubuntu, Debian, entre outros). O processo de instalação é similar ao do Windows, portanto, sendo possível utilizar as mesmas con�gurações a seguir. Após iniciada, aparecerá uma interface como a mostrada na Figura 2.2. Para iniciar a instalação, basta clicar no botão Next e, depois disso, aceitar os termos de condições, de acordo com o exibido na Figura 2.3. Figura 2.1 - Página o�cial para o download do MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a página com as opções de download do MongoDB. Para isso, escolha a opção On-Premises. Existem mais duas opções, (a) Cloud, para a utilização do MongoDB na nuvem e (b) Tools, para baixar algumas ferramentas de con�guração. Figura 2.2 - Primeira interface de instalação do MongoDB no sistema operacional Windows. Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface de instalação do MongoDB no sistema operacional Windows. Nessa interface, está escrito “Back”, “Next” e “Cancel”. O “Next” está em destaque. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 5/48 Depois de aceitar os termos e condições, a próxima interface solicita se você gostaria de fazer a instalação completa ou personalizada. Escolha a completa e clique em Next, como mostrado na Figura 2.4. Depois disso, vamos realizar a con�guração básica do MongoDB, conforme mostrado na Figura 2.5. Escolha um usuário de sua preferência (que já esteja criado em seu sistema operacional) e clique em Next. Figura 2.3 - Interface com os termos e condições da utilização do banco de dados MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface contendo os termos e condições de utilização do banco de dados MongoDB. Nessa interface, está escrito “Print”, “Back”, “Next” e “Cancel”. O “Next” está em destaque. A opção para aceitar os termos deve estar marcada. Figura 2.4 - Interface para escolha do tipo de instalação do banco de dados MongoDB Fonte: Elaborado pelo autor. #PraCegoVer: a imagem apresenta a interface de seleção dos tipos de instalação disponíveis para o banco de dados MongoDB. A opção completa foi selecionada. Nessa interface, está escrito “Complete”, “Custom”, “Back”, “Next” e “Cancel”. O “Complete” está em destaque. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 6/48 Com isso, estamos prontos para instalar o banco de dados. Mas existe também a possibilidade da instalação de uma interface grá�ca, além do shell, para gerenciamento do banco de dados, conforme mostrado na Figura 2.6. Figura 2.5 - Interface de con�guração do banco de dados MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface para con�guração do usuário que será utilizado para iniciar o banco de dados e as con�gurações do diretório de instalação. Nessa interface, está escrito “Back”, “Next” e “Cancel”. Existe, ainda, a opção para informar o usuário que será responsável por iniciar o banco de dados, em destaque. Figura 2.6 - Interface para seleção da possibilidade de instalação da interface grá�ca de gerenciamento do banco de dados MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface para seleção da possibilidade de instalação da interface grá�ca de gerenciamento de banco de dados MongoDB. Deixe a opção selecionada. Nessa interface, está escrito “Back”, “Next” e “Cancel”. A opção “Install MongoDB Compass” está em destaque. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 7/48 Depois disso, ao clicar em Next, a instalação será executada. Ao �nal da instalação, se feita com sucesso, será apresentada a interface mostrada na Figura 2.7. Pronto, agora, temos o banco de dados instalado e pronto para ser utilizado, tanto via shell ou pela interface grá�ca. Durante nossos estudos, vamos utilizar o shell para facilitar o aprendizado. Bancos de Dados, Coleções e Documentos Como você provavelmente já sabe, o MongoDB armazena as informações em documentos que podem ser impressos no formato JSON (JavaScript Object Notation). Você provavelmente gostaria de armazenar diferentes tipos de documentos, como usuários e pedidos, em locais separados. Isso signi�ca que o MongoDB precisa de uma maneira de agrupar documentos, semelhante a uma tabela em um RDBMS (CONNOLLY; BEGG, 2019). No MongoDB, isso é chamado de coleção (BANKER et al., 2016). O MongoDB divide as coleções em bancos de dados separados. Ao contrário da sobrecarga normal que os bancos de dados produzem no mundo SQL, os bancos de dados no MongoDB são apenas namespaces para distinguir entre as coleções (CONNOLLY; BEGG, 2019). Para consultar o MongoDB, você precisa conhecer o banco de dados (ou namespace) e a coleção que você deseja consultar para obter os documentos. Se nenhum outro banco de dados é especi�cado na inicialização, o shell seleciona um banco de dados padrão chamado teste. Como uma forma de manter todosos exercícios subsequentes do tutorial sob o mesmo namespace, vamos começar abrindo o shell sem selecionar nenhum banco, conforme a Figura 2.8. Figura 2.7 - Interface mostrando o �nal da instalação do banco de dados MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface de instalação que mostra o �m da instalação, caso seja bem sucedida. Nessa interface, está escrito “Back”, “Finish” e “Cancel”. O “Finish” está em destaque. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 8/48 Todas as coleções em um banco de dados são agrupadas nos mesmos arquivos, então faz sentido, do ponto de vista da memória, manter coleções relacionadas no mesmo banco de dados (BAHGA; MADISETTI, 2016). Você também pode querer que diferentes aplicativos acessem as mesmas coleções (multilocação), também é útil manter seus dados organizados para você estar preparado para os requisitos futuros. Figura 2.8 - A interface do shell para a execução dos comandos no banco de dados MongoDB Fonte: Elaborada pelo autor. #PraCegoVer: a imagem apresenta a interface do shell para a execução dos comandos no banco de dados MongoDB. Essa interface será utilizada para a execução dos comandos deste estudo. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_ID… 9/48 Feito isto, temos o MongoDB instalado e com as con�gurações básicas para o início da operação. Além disso, temos acesso à documentação que vem com o banco de dados e mais a ferramenta grá�ca de gerenciamento, chamada Compass. Agora, estamos prontos para iniciar o trabalho com operações de escrita e recuperação de dados, além, é claro, de obter estatísticas e realizar algumas con�gurações adicionais. Inserts e Queries É hora de criar seu primeiro documento. Pelo fato de estarmos usando um shell JavaScript, os documentos serão especi�cados em JSON (BANKER et al., 2016). Por exemplo, um documento simples que descreve o usuário pode ter a seguinte aparência: saiba maisSaiba mais Sobre a criação de bancos de dados e coleções Bancos de dados e coleções são criados apenas quando os documentos são inseridos pela primeira vez. Esse comportamento é consistente com a abordagem dinâmica do MongoDB para dados; assim como a estrutura dos documentos não precisa ser de�nida com antecedência, coleções e bancos de dados individuais podem ser criados em tempo de execução. Isso pode levar a um processo de desenvolvimento simpli�cado e acelerado. Dito isto, se você está preocupado com bancos de dados ou coleções sendo criados acidentalmente, a maioria dos drivers permite que você habilite um modo estrito para evitar tais erros descuidados. Fonte: Banker et al. (2016) Fonte: Docs MongoDB (2020a). Você pode ter acesso a um material detalhado sobre o assunto na documentação o�cial do MongoDB no seguinte link: ACESSAR https://docs.mongodb.com/manual/core/document/ 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 10/48 {username: "everton"} O documento contém uma única chave e valor para armazenar o nome de usuário de “everton”. Agora, vamos inserir nosso primeiro documento. Para tal, digite o comando a seguir. db.users.insert({username: "everton"}) Você pode notar um pequeno atraso após inserir esse código. O atraso é causado pela alocação dos arquivos de dados iniciais para ambos, banco de dados e coleção (BANKER et al., 2016). Se a inserção for bem-sucedida, você acabou de salvar seu primeiro documento. No MongoDB, esses dados, agora, têm a garantia de ser inseridos, mesmo se você matar o shell ou reiniciar sua máquina. Você pode executar a consulta para ver o novo documento: db.users.find() Como os dados agora fazem parte da coleção de users, reabrir o shell e executar a consulta mostrará o mesmo resultado. A resposta será mais ou menos assim: {"_id":"5fb9630bbe7eef004116c4bd","username":"everton"} Observe que um campo _id foi adicionado ao documento. Você pode pensar no _id valor como a chave primária do documento. Cada documento MongoDB requer um _id, e se não estiver presente quando o documento for criado, um ObjectID especial do MongoDB será gerado e adicionado ao documento naquele momento (BANKER et al., 2016). O ObjectID que aparece em seu console não será igual ao da lista de códigos, mas será único entre todos os valores _id na coleção, que é o único requisito para o campo. Você pode de�nir seu próprio _id con�gurando-o no documento inserido, o ObjectID é apenas padrão do MongoDB. Vamos continuar, agora, adicionando um segundo usuário à coleção: db.users.insert({username: "gomede"}) Agora, deve haver dois documentos na coleção. Vá em frente e veri�que isso executando o comando de contagem: db.users.count() 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 11/48 Nesse último comando, deve procurar pela quantidade total de documentos na coleção para retornar, na forma de inteiro, como resposta. É importante destacar que os comandos de agregação não exigem a necessidade de percorrer todos os documentos da coleção, mas sim procurar no metadados do MongoDB para oferecer uma resposta mais rápida ao usuário. Predicados em uma Consulta Agora que você tem mais de um documento na coleção, vamos examinar algumas consultas um pouco mais so�sticadas. Como antes, você ainda pode consultar todos os documentos na coleção: db.users.find() Você também pode passar um predicado de consulta simples para o método find(). Um predicado de consulta é um documento que é usado para comparar com todos os documentos da coleção (BANKER et al., 2016). Para consultar todos os documentos em que o nome de usuário é gomede, você passa um documento simples que atua como seu seletor de consulta, como este: db.users.find({username: "gomede"}) O predicado de consulta {username: "gomede"} retorna todos os documentos em que o nome de usuário é gomede — ele corresponde literalmente aos documentos existentes. Observe que chamar o método �nd sem nenhum argumento é equivalente a passar um predicado vazio; db.users.find() é igual a db.users.find({}). Você também pode especi�car vários campos no predicado da consulta, o que cria um AND implícito entre os campos. Por exemplo, você consulta com o seguinte predicado: db.users.find({ _id: ObjectId("5fb97de0808de3f96bf2e0d7"), username: "gomede" }) Os três pontos após a primeira linha da consulta são adicionados pelo shell MongoDB para indicar que o comando ocupa mais de uma linha. O predicado da consulta é idêntico ao documento retornado (BANKER et al., 2016). Você também pode usar o operador $and do MongoDB explicitamente. A consulta anterior é idêntica para: db.users.find({ $and: [ 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 12/48 { _id: ObjectId("5fb97de0808de3f96bf2e0d7") }, { username: "gomede"} ] }) A seleção de documentos com OR é semelhante: basta usar o operador $or. Considere a seguinte consulta: db.users.find({ $or: [ { username: "everton" }, { username: "gomede" } ]}) A consulta retorna os documentos “everton” e “gomede”, porque solicitamos um nome de usuário de everton ou um nome de usuário de gomede. Esse exemplo é diferente dos anteriores, porque não apenas insere ou procura um documento especí�co. Em vez disso, a própria consulta é um documento. A ideia de representar comandos como documentos é usada frequentemente no MongoDB e pode ser uma surpresa se você está acostumado com bancos de dados relacionais. Uma vantagem desta interface é que é mais fácil construir consultas programaticamente em seu aplicativo, porque são documentos em vez de uma longa string SQL. Durante estaunidade, aprendemos como realizar, entre outras atividades, as operações básicas de um banco de dados, conhecidas como CRUD. Olhe para o infográ�co a seguir para relembrar cada uma delas e para qual parte do acrônimo as letras CRUD se referem. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 13/48 #PraCegoVer: o infográ�co apresenta quatro retângulos que formam um quadrado. No centro desses retângulos há um retângulo pequeno escrito “crud”. O primeiro retângulo, que está à esquerda, na parte superior, apresenta o título “CREATE” e logo abaixo “db.users.insert()”. Ao clicar neste título, aparece o texto “criação de um documento dentro de uma coleção”. O segundo retângulo, que está à direita, na parte de superior, apresenta o título “READ” e logo abaixo “db.users.�nd()”. Ao clicar neste título, aparece o texto “leitura de um ou mais documentos de uma coleção”. O terceiro retângulo, que está à esquerda, na parte inferior, apresenta o título “UPDATE” e logo abaixo “db.users.update()”. Ao clicar neste título, aparece o texto “atualização de um ou mais documentos dentro de uma coleção”. O quarto retângulo, que está à direita, na parte inferior, apresenta o título “DELETE”, e logo abaixo “db.users.remove()”. Ao clicar neste título, aparece o texto “remoção de um ou mais documentos dentro de uma coleção”. Apresentamos os fundamentos da criação e leitura de dados. Agora, é hora de olhar para como atualizar esses dados. Atualizando os Documentos Todas as atualizações requerem pelo menos dois argumentos. O primeiro especi�ca quais documentos são necessários para a atualização, e o segundo de�ne como os documentos selecionados devem ser modi�cados. Os primeiros exemplos demonstram a modi�cação de um 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 14/48 único documento, mas as mesmas operações podem ser aplicadas a muitos documentos, até mesmo uma coleção inteira. Mas tenha em mente que, por padrão, o método update() atualiza um único documento. Existem dois tipos de atualizações, com diferentes propriedades e casos de uso. Um tipo de atualização envolve a aplicação de operações de modi�cação a um documento ou documentos, e o outro tipo envolve a substituição do documento antigo por um novo (BANKER et al., 2016). Para os exemplos a seguir, veremos este documento de amostra: db.users.find({username: "everton"}) A função de busca find() pode utilizar muitos parâmetros, ou predicados de consultas. No exemplo anterior, utilizamos apenas um. Tais predicados podem gerar consultas muito re�nadas para atender a vários cenários de recuperação de informação. O MongoDB possibilita recuperação de dados das mais variadas maneiras, como vamos ver na sequência. Operador de Atualização O primeiro tipo de atualização envolve a passagem de um documento para algum tipo de operador descrito como o segundo argumento para a função de atualização. Vamos ver um exemplo de como usar o operador $set, que de�ne um único campo para um valor especi�cado. Suponha que o usuário everton decida adicionar seu país de residência. Você pode gravar isso com a seguinte atualização: db.users.update({username: "everton"}, {$set: {country: "Brasil"}}) Essa atualização diz ao MongoDB para encontrar um documento no qual o nome de usuário é everton e, em seguida, que de�na o valor da propriedade do país como Brasil. Se agora você emitir uma consulta, verá que o documento foi atualizado em conformidade: db.users.find({country: "Brasil"}) Operador de Substituição Outra maneira de atualizar um documento é substituí-lo em vez de apenas de�nir um campo. Às vezes, isso é usado erroneamente quando se pretende uma atualização de operador com $set. Considerar um comando de atualização ligeiramente diferente: db.users.update({username: "everton"}, {$set: {country: "Dinamarca"}}) db.users.find({country: "Dinamarca"}) 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 15/48 Nesse caso, o documento é substituído por outro que contém apenas o campo do país, e o campo do nome de usuário é removido, porque o primeiro documento é usado apenas para correspondência, e o segundo documento é usado para substituir o documento que estava anteriormente. Você deve ter cuidado ao usar esse tipo de atualização. Uma consulta para o documento produz o seguinte: db.users.find({country: "Dinamarca"}) O _id é o mesmo, mas os dados foram substituídos na atualização. Certi�que-se de usar o $set operador se você pretende adicionar ou de�nir campos em vez de substituir todo o documento. Adicione o nome de usuário de volta ao registro: db.users.update({country: "Dinamarca"}, {$set: {username: "gomede"}}) Se você decidir posteriormente que o país armazenado no per�l não é mais necessário, o valor pode ser removido facilmente usando o operador $unset: db.users.update({username: "everton"}, {$unset: {country: 1}}) A função de busca update() pode utilizar muitos parâmetros, ou predicados de atualizações No exemplo anterior, utilizamos apenas dois. Tais predicados podem gerar atualizações muito re�nadas para atender a vários cenários de atualização de informação. O MongoDB possibilita atualização de dados das mais variadas maneiras, como vamos ver na sequência. Atualizando Dados Complexos Vamos enriquecer este exemplo. Você está representando seus dados com documentos, que, como visto anteriormente, podem conter estruturas de dados complexas. Vamos supor que, além disso, para armazenar informações de per�l, seus usuários podem armazenar listas de suas coisas favoritas. Uma boa representação de documento pode ter a seguinte aparência: { username: "gomede", favorites: { cities: ["Maringá", "Londrina"], movies: ["Casablanca", "For a Few Dollars More", "The Sting"] 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 16/48 } } A chave de favoritos aponta para um objeto que contém duas outras chaves, que apontam para listas de cidades e �lmes favoritos. Considerando o que você já sabe, você pode pensar em uma maneira de modi�car o documento original se parece com este? O operador $set deve vir à mente: db.users.update( {username: "everton"}, { $set: { favorites: { cities: ["Maringá", "Londrina"], movies: ["Casablanca", "For a Few Dollars More", "The Sting"] } } }) Observe que o uso de espaçamento para recuo não é obrigatório, mas ajuda a evitar erros, pois o documento é mais legível desta forma. Vamos modi�car “gomede” de maneira semelhante, mas, neste caso, você adicionará apenas alguns �lmes favoritos: db.users.update( {username: "gomede"}, { $set: { favorites: { movies: ["Casablanca", "Rocky"] } } }) 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 17/48 Se você cometer um erro de digitação, poderá usar a tecla de seta para cima para recuperar a última instrução do shell. Agora, consulte a coleção de usuários para veri�car se as duas atualizações foram bem-sucedidas: db.users.find().pretty() { "_id" : ObjectId("5fbae86f5da1a87e9fcd383d"), "username" : "everton", "favorites" : { "cities" : [ "Chicago", "Cheyenne" ], "movies" : [ "Casablanca", "For a Few Dollars More", "The Sting" ] } } Estritamente falando, o comando find() retorna um cursor para os documentos de retorno. Portanto, para acessar os documentos, você precisará iterar o cursor. O comando find() retorna automaticamente 20 documentos, se estiverem disponíveis, após iterar o cursor 20 vezes. Com alguns documentos de exemplo ao seu alcance, agora, você pode começar a ver o poder da linguagem de consultado MongoDB (BANKER et al., 2016). Em particular, a capacidade do mecanismo de consulta de alcançar em objetos internos aninhados e combinar com elementos de matriz prova-se útil nesta situação. Observe como acrescentamos a operação bonita à operação de localização para obter resultados bem formatados retornados pelo servidor. Estritamente falando, pretty() é, na verdade, cursor.pretty(), que é uma maneira de con�gurar um cursor para exibir os resultados de uma forma fácil de leitura do formato. Você pode ver um exemplo de ambos os 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 18/48 conceitos demonstrados nesta consulta para encontrar todos os usuários que gostam do �lme “Casablanca”: db.users.find({"favorites.movies": "Casablanca"}) O ponto entre favoritos e �lmes instrui o mecanismo de consulta a procurar por uma chave favorita nomeada que aponta para um objeto com uma chave interna chamada �lmes e, em seguida, para corresponder ao valor da chave interna. Assim, essa consulta retornará ambos os documentos do usuário, porque as consultas em matrizes corresponderão se qualquer elemento da matriz corresponder a consulta original. Para ver um exemplo mais interessante, suponha que você saiba que qualquer usuário que gosta de “Casablanca” também gosta do “Falcão Maltês” e deseja atualizar seu banco de dados para re�etir esse fato. Como você representaria isso como uma atualização do MongoDB? Excluindo os Documentos Agora que você conhece os princípios básicos de criação, leitura e atualização de dados por meio do MongoDB Shell, vamos aprender uma operação mais simples, a remoção de dados. Se nenhum parâmetro for fornecido, uma operação de remoção limpará uma coleção de todos os seus documentos (BANKER et al., 2016). Para se livrar, digamos, do conteúdo de uma coleção de foo, você insere o comando: db.foo.remove() Muitas vezes, você precisa remover apenas um determinado subconjunto de documentos de uma coleção; para isso, você pode passar um seletor de consulta para o método remove(). Se você quiser remover todos usuários cuja cidade favorita é Cheyenne, a expressão é direta: db.users.remove ({"favorites.cities": "Londrina"}) Observe que a operação remove() não exclui realmente a coleção, apenas remove documentos de uma coleção. Você pode pensar nisso como sendo análogo ao de SQL. Se sua intenção é excluir a coleção com todos os seus índices, use drop() método: db.users.drop() Criar, ler, atualizar e excluir são as operações básicas de qualquer banco de dados. E se você compreendeu o conteúdo até esse ponto, deve estar em uma posição para continuar praticando o 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 19/48 CRUD básico operações no MongoDB. Como vimos, as operações fundamentais de leitura e escrita (CRUD) precisam de um banco de dados e uma coleção. Esses são os elementos essenciais para iniciar o trabalho com o MongoDB. Conhecimento Teste seus Conhecimentos saiba maisSaiba mais Tipos de símbolo BSON No que diz respeito à consulta, o servidor MongoDB tratará um tipo de símbolo BSON da mesma forma que trata uma string; é apenas quando o documento é recuperado que um mapeamento do tipo símbolo para o tipo de chave é feito. Observe também que, eventualmente, o símbolo está obsoleto na última especi�cação BSON e pode desaparecer a qualquer momento. Independentemente do idioma com o qual você escreve seus dados, você deve ser capaz de recuperá-lo em qualquer outro idioma com uma implementação BSON. Fonte: Banker, et al. (2016). Fonte: BSON (2020). Para saber mais, consulte o link ACESSAR http://bsonspec.org/ 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 20/48 (Atividade não pontuada) A recuperação de documentos de uma coleção é uma das partes sensíveis de um projeto de banco de dados bem sucedido. Para isso, o MongoDB disponibiliza uma série de recursos de recuperação de informação que permite o desenvolvedor uma combinação quase in�nita de possibilidades. Neste caso, imagine que queiramos recuperar um documento de uma coleção chamada users com o atributo lastaccess= “20200620”. BANKER, K. et al. MongoDB in Action. 2. ed. Nova Iorque: Manning Publications Co., 2016. Assinale a alternativa que indique corretamente como podemos especi�car o predicado da consulta: a) db.users.find({lastaccess: "*"}) Feedback: alternativa incorreta, pois este comando possui um predicado inválido, visto que o valor “*” não é reconhecido como um predicado pelo shell do MongoDB. b) db.users.find({ $and: [{ lastaccess: "20200620"}]}) Feedback: alternativa incorreta, pois este comando possui um predicado que, apesar de adicionar a busca do valor correto, apresenta o operador $and sem uma concatenação válida. c) db.users.count().explain("executionStats") Feedback: alternativa incorreta, pois este comando conta todos os documentos inseridos na coleção users, mas sem retornar os valores. A explicação da consulta também foi adicionada. d) db.users.find({lastaccess: "20200620"}) Feedback: alternativa correta, pois este comando apresenta o predicado válido para a consulta desejada. Ela vai retornar o documento com o lastaccess= “20200620”. e) db.users.find({ $or: [ { lastaccess: "20200620" }}) Feedback: alternativa incorreta, pois este comando possui um predicado que, apesar de adicionar a busca do valor correto, apresenta o operador $or sem uma concatenação válida. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 21/48 Vamos examinar de perto a modelagem de dados orientada a documentos e como os dados são organizados nos níveis de banco de dados, coleção e documentos no MongoDB. Vamos começar com uma breve discussão geral sobre como projetar esquemas para usar com o MongoDB. Lembre-se, o próprio MongoDB não impõe um esquema, mas todo aplicativo precisa de alguns padrões internos básicos sobre como seus dados são armazenados (BANKER et al., 2016). Ao longo do caminho, você verá como esse esquema difere de um esquema RDBMS equivalente, e você aprenderá como os relacionamentos típicos entre entidades, como um-para-muitos e muitos-para- muitos são representados em MongoDB (CAMPELLO; CALDEIRA, 2014). Isso envolve uma discussão mais detalhada de bancos de dados, coleções e documentos do que você viu até este ponto (BANKER et al., 2016). Princípios de Design de Esquemas O design de esquema de banco de dados é o processo de escolha da melhor representação para um dado de�nido, dados os recursos do sistema de banco de dados, a natureza dos dados e os requisitos do aplicativo (CONNOLLY; BEGG, 2019). Os princípios de design de esquema para sistemas de banco de dados relacionais estão bem estabelecidos. Com RDBMSs, você é encorajado a buscar dados normalizados no modelo, o que ajuda a evitar atualizações de dados que podem resultar em inconsistências. Além disso, os padrões estabelecidos impedem os desenvolvedores de imaginar como modelar, digamos, relacionamentos um-para-muitos e muitos-para-muitos. Mas o projeto do esquema nunca é uma ciência exata, mesmo com bancos de dados relacionais Design Design Aplicado àAplicado à Estrutura de Dados deEstrutura de Dados de Bancos de Dados NãoBancos de Dados Não RelacionaisRelacionais 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 22/48 (CONNOLLY; BEGG, 2019). A questão de desempenho é o objetivo �nal no design de esquema, então, cada “regra” tem exceções. Se você está vindo do mundo RDBMS, você pode estar preocupado com a falta de MongoDB de regras rígidas de design de esquema. Surgiram boas práticas, mas geralmente ainda há maisde uma boa maneira de modelar um determinado conjunto de dados. A premissa desta seção é que princípios podem orientar o design de esquemas, mas a realidade é que esses princípios são �exíveis (CAMPELLO; CALDEIRA, 2014). Para começar a pensar, aqui estão algumas perguntas que você pode trazer para a mesa ao modelar dados com qualquer sistema de banco de dados: a. Quais são os seus padrões de acesso ao aplicativo? Você precisa de�nir as necessidades de seu aplicativo, e isso deve informar não apenas o design do seu esquema, mas também quais bancos de dados que você escolher. Lembre-se de que o MongoDB não é adequado para todos os aplicativos. b. Compreender os padrões de acesso do seu aplicativo é de longe o mais importante aspecto do design do esquema. As idiossincrasias de um aplicativo podem facilmente exigir um esquema que vá contra princípios de modelagem de dados �rmemente sustentados. O resultado é que você deve fazer inúmeras perguntas sobre a aplicação antes que você possa determinar o ideal modelo de dados. Qual é a proporção de leitura/gravação? As consultas serão simples, como procurar uma chave, ou mais complexas? As agregações serão necessárias? Quantos dados vão ser armazenados? c. Qual é a unidade básica de dados? Em um RDBMS, você tem tabelas com colunas e linhas. Em um armazenamento de valor-chave, você tem chaves apontando para valores amorfos. No MongoDB, a unidade básica de dados é o documento BSON. d. Quais são os recursos do seu banco de dados? Depois de entender o tipo básico de dados, você precisa saber como manipulá-lo. RDBMSs apresentam consultas ad hoc e junções, geralmente escritas em SQL, enquanto armazenamentos de valores-chave simples permitem a busca de valores apenas por uma única chave. O MongoDB também permite consultas ad hoc, mas as junções não são suportadas. Os bancos de dados também divergem quanto aos tipos de atualizações que permitem. Com um RDBMS, você pode atualizar registros de maneiras so�sticadas, usando SQL, e agrupar várias atualizações em uma transação para obter atomicidade e reversão. MongoDB não suporta transações no sentido tradicional, mas suporta uma variedade de operações de atualização, que podem funcionar nas estruturas internas de um documento complexo (CAMPELLO; CALDEIRA, 2014). Com armazenamentos de valores-chave simples, você pode atualizar um valor, mas cada atualização normalmente signi�ca substituir o valor completamente. A. O que constitui um bom ID exclusivo ou chave primária para um registro? Existem exceções, mas muitos esquemas, independentemente do sistema de banco de dados, têm alguma chave única para cada registro. Escolher essa chave com cuidado pode fazer uma grande diferença em como você acessa seus dados e como eles são armazenados. Se você estiver projetando uma coleção de usuário, por exemplo, você deve usar um valor arbitrário, um nome legal, um nome de 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 23/48 usuário ou um número de segurança social como a chave primária? Acontece que nenhum dos nomes legais nem os números de previdência social são únicos, ou mesmo aplicáveis a todos os usuários em um determinado conjunto de dados. No MongoDB, escolher uma chave primária signi�ca escolher o que deve ir no campo _id. Os ids de objeto automáticos são bons padrões, mas não ideais em todos os casos. Isso é particularmente importante se você fragmentar seus dados em várias máquinas, porque determina para onde um determinado registro irá. Os melhores designs de esquema são sempre o produto de um profundo conhecimento do banco de dados que você está usando, bom senso sobre os requisitos do aplicativo em questão e experiência simples e antiga. Um bom esquema geralmente requer experimentação e iteração, como quando um aplicativo é dimensionado e as considerações de desempenho mudam (BANKER et al., 2016). Não tenha medo de alterar seu esquema ao aprender coisas novas, apenas raramente é possível planejar um aplicativo antes de sua implementação. Os exemplos neste capítulo foram projetados para ajudá-lo a desenvolver um bom senso de design de esquema no MongoDB. Tendo estudado esses exemplos, você estará bem preparado para projetar os melhores esquemas para seus próprios aplicativos. Projetando um Modelo de Dados de Comércio Eletrônico O MongoDB, inicialmente, não exige muita re�exão sobre o design do esquema; veremos um domínio muito mais rico de comércio eletrônico. O comércio eletrônico tem a vantagem de incluir um grande número de conhecidos padrões de modelagem de dados. Além disso, não é difícil imaginar como produtos, categorias, análises de produtos e pedidos são normalmente modelados em um RDBMS (CORONEL; MORRIS, 2015). Isso deve tornar os próximos exemplos mais instrutivos, porque você poderá compará-los com suas noções preconcebidas de design de esquema. O e- commerce normalmente é feito com RDBMSs por alguns motivos. O primeiro é que os sites de comércio eletrônico geralmente exigem transações, e as transações são um RDBMS grampo. A segunda é que, até recentemente, os domínios exigiam modelos de dados ricos; logo, considerou- se que consultas so�sticadas se encaixam melhor no domínio do RDBMS (CORONEL; MORRIS, 2015). Os exemplos a seguir questionam essa segunda suposição. Construir um back-end de e-commerce inteiro não é prático dentro deste livro. Em vez disso, escolhemos um punhado de entidades de comércio eletrônico comuns e úteis, como produtos e avaliações de clientes, para mostrar como eles podem ser modelados em MongoDB. Em particular, veremos produtos e categorias, usuários e pedidos, além de revisão de produtos. Para cada entidade, mostraremos um documento de exemplo. Então, vamos mostrar alguns dos recursos do banco de dados que complementam a estrutura do documento. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 24/48 Para muitos desenvolvedores, o modelo de dados anda de mãos dadas com o mapeamento de objetos; para esse propósito, você pode ter usado uma biblioteca de mapeamento objeto- relacional, como o Hibernate do Java framework ou ActiveRecord Ruby (BANKER et al., 2016). Essas bibliotecas podem ser úteis para e�cientemente construir aplicativos com um RDBMS, mas elas são menos necessárias com o MongoDB, devido, em parte, ao fato de que um documento já é uma representação semelhante a um objeto. Além disso, está também em parte devido aos drivers do MongoDB, que já fornecem uma interface de alto nível para MongoDB. Sem dúvida, você pode construir aplicativos no MongoDB usando apenas a interface do driver. Mapeadores de objetos podem fornecer valor ajudando com validações, veri�cação de tipo e associações entre modelos; além disso, eles vêm por padrão em estruturas (frameworks) como Ruby on Rails (CONNOLLY; BEGG, 2019). Os mapeadores de objetos também introduzem uma camada adicional de complexidade entre o programador e o banco de dados, o que pode ocultar características de consulta importantes. Você deve avaliar essa compensação ao decidir se seu aplicativo deve usar um mapeador de objetos; há muitos aplicativos excelentes escritos com e sem um mapeador de objetos. Nós não usamos um mapeador de objetos em qualquer exemplo deste livro, recomendamos que você primeiro aprenda sobre o MongoDB sem um. Noções Básicas de Esquema Produtos e categorias são os pilares de qualquer site de comércio eletrônico. Produtos, de forma normalizada em um modelo RDBMS, tendem a exigir um grande número de tabelas (CONNOLLY; BEGG, 2019). Existem tabelas para informações básicas do produto, como o nome e SKU, mas haverá outras tabelas para relacionar informações de envio e históricos de preços. Este esquema multitabelas será facilitado pela capacidade do RDBMS de unir tabelas. Modelar um produto no MongoDB deve ser menos complicado, porque coleções não impõem um esquema, qualquer documento de produtoterá espaço para quaisquer atributos dinâmicos de que o produto precise. Usando matrizes em seu documento, você pode normalmente condensar uma representação RDBMS multitable em uma única coleção MongoDB. Mais concretamente, a listagem a seguir mostra um exemplo de produto de uma loja de jardinagem. É aconselhável atribuir este documento a uma variável antes de inseri-lo no banco de dados usando db.products.insert (variável) para poder executar as consultas discutidas nas próximas páginas. { _id: ObjectId("4c4b1476238d3b4dd5003981"), slug: "wheelbarrow-9092", sku: "9092", name: "Extra Large Wheelbarrow", 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 25/48 description: "Heavy duty wheelbarrow...", details: { weight: 47, weight_units: "lbs", model_num: 4039283402, manufacturer: "Acme", color: "Green" }, total_reviews: 4, average_review: 4.5, pricing: { retail: 589700, sale: 489700, }, price_history: [ { retail: 529700, sale: 429700, start: new Date(2010, 4, 1), end: new Date(2010, 4, 8) }, { retail: 529700, sale: 529700, start: new Date(2010, 4, 9), end: new Date(2010, 4, 16) 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 26/48 }, ], primary_category: ObjectId("6a5b1476238d3b4dd5000048"), category_ids: [ ObjectId("6a5b1476238d3b4dd5000048"), ObjectId("6a5b1476238d3b4dd5000049") ], main_cat_id: ObjectId("6a5b1476238d3b4dd5000048"), tags: ["tools", "gardening", "soil"], } O documento contém os campos básicos de nome, sku e descrição. Há também o ID de objeto do MongoDB padrão armazenado no campo _id. Slug Único Além disso, você de�niu um slug slug: "wheelbarrow-9092", carrinho de mão-9092, para fornecer uma URL. Os usuários do MongoDB às vezes reclamam da feiura dos IDs de objeto em URLs. Naturalmente, você não quer URLs assim: http://mygardensite.org/products/4c4b1476238d3b4dd5003981 IDs signi�cativos são muito melhores: http://mygardensite.org/products/wheelbarrow-9092 Esses links permanentes amigáveis são frequentemente chamados de slugs. Geralmente, recomendamos construir um campo slug se um URL for gerado para o documento. Esse campo deve ter um índice exclusivo para que o valor tenha acesso rápido à consulta e seja garantido único. Você também pode armazenar o slug em _id e usá-lo como uma chave primária (BANKER et al., 2016). Nós escolhemos não fazer isso neste caso, para demonstrar índices únicos; qualquer forma é aceitável. Assumindo que você está armazenando este documento na coleção de produtos, você pode criar o exclusivo índice como este: 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 27/48 db.products.createIndex ({slug: 1}, {unique: true}) Se você tiver um índice exclusivo no slug, uma exceção será lançada se você tentar inserir um valor duplicado. Dessa forma, você pode tentar novamente com um slug diferente, se necessário. Imagine que a sua loja de jardinagem tem vários carrinhos de mão à venda. Quando você começa a vender um novo carrinho de mão, seu código precisará gerar um pacote exclusivo para o novo produto. Veja como você executaria a inserção em Ruby, por exemplo: @ products.insert_one ({ : name => "Carrinho de mão extra grande", : sku => "9092", : slug => "wheelbarrow-9092"}) A menos que você especi�que o contrário, o driver garante automaticamente que nenhum erro foi levantado. Se a inserção for bem-sucedida sem gerar uma exceção, você sabe que escolheu um slug único. Mas se uma exceção for levantada, seu código precisará tentar novamente com um novo valor para o slug. Documentos Aninhados Digamos que você tenha uma chave que aponta para um subdocumento contendo vários detalhes dos produtos. Essa chave é totalmente diferente do campo _id, porque permite que você encontre coisas dentro de um documento existente (BANKER et al., 2016). Você especi�cou o peso, as unidades de peso e o número do modelo do fabricante. Você também pode armazenar outros atributos ad hoc aqui. Por exemplo, se você estava vendendo sementes, você pode incluir atributos para o esperado rendimento e tempo de colheita, e se você estava vendendo cortadores de grama, você poderia incluir cavalos de força, tipo de combustível e opções de cobertura morta. O atributo de detalhes fornece um bom contêiner para esses tipos de atributos dinâmicos. Um exemplo de uma estrutura de comércio eletrônico, modelado com Uni�ed Modeling Language (UML) e organizado de acordo com os assuntos, pode ser visto na Figura 2.9. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 28/48 O modelo apresenta algumas entidades para acomodar as informações de produtos, revisões, usuários, categorias e pedidos. Deve-se notar que tais entidades, que se transformam em coleções dentro do MongoDB, foram acomodadas, de forma conveniente por assunto, dentro de pacotes. Conhecimento Teste seus Conhecimentos (Atividade não pontuada) As idiossincrasias de um aplicativo podem facilmente exigir um esquema que vá contra princípios de modelagem de dados �rmemente sustentados. O resultado é que você deve fazer inúmeras perguntas sobre a aplicação antes que você possa determinar o ideal modelo de dados. Figura 2.9 - Modelo para um comércio eletrônico projetado com a linguagem UML Fonte: (BANKER et al., 2016, p.124) #PraCegoVer: a imagem apresenta uma possibilidade de um modelo para comércio eletrônico modelado com a Uni�ed Modeling Language (UML). Como vimos anteriormente, modelos não são uma ciência exata, e este deve ser considerado como uma das possibilidades. Tal imagem mostra 5 grupos de coleções, chamados de “Products”, “Categories”, “Reviews”, “Orders” e “Users”. Cada um deles contém, respectivamente, as coleções de produtos, categorias, avaliações, pedidos e usuários. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 29/48 BANKER, K. et al. MongoDB in Action. 2. ed. Nova Iorque: Manning Publications Co., 2016. Nesse contexto, assinale a alternativa que indica corretamente qual princípio do design estamos falando. a) Unidade básica de dados. Feedback: alternativa incorreta, pois a unidade básica dos dados se refere à coleção central onde os documentos serão armazenados, sendo uma questão secundária do design. b) Recursos do banco de dados. Feedback: alternativa incorreta, pois os recursos se referem a questões como processamento, memória, rede e disco, sendo uma questão secundária do design. c) Chave primária para um registro. Feedback: alternativa incorreta, pois a chave primária de um documento (registro) pode ser criada facilmente pelo MongoDB, sendo uma questão secundária do design. d) Padrões de acesso do aplicativo. Feedback: alternativa correta, pois os padrões de acesso do aplicativo, como usuários, leitura/escrita, documentos, coleções, índices, entre outros, são as questões centrais do design de um modelo de dados. e) ID exclusivo para um slug. Feedback: alternativa incorreta, pois um slug serve para facilitar o acesso, via URL, dos documentos em uma coleção. Como o slug pode ser adicionado a qualquer momento, isso é uma questão secundária. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 30/48 É comum criar índices para melhorar o desempenho da consulta (BANKER et al., 2016). Felizmente, no MongoDB, índices podem ser criados facilmente a partir do shell. Se você é novo em índices de banco de dados, esta seção deve deixar clara a necessidade deles; se você já tem experiência em indexação, verá como é fácil criar índices e, em seguida,consultas de per�l contra eles, usando o método explain(). Grandes Coleções Um exemplo de indexação só faz sentido se você tiver uma coleção com muitos documentos (BAHGA; MADISETTI, 2016). Então, vamos adicionar 20.000 documentos simples a uma coleção de números, porque o MongoDB shell também é um interpretador de JavaScript (BANKER et al., 2016). O código para fazer isso é simples: for(i = 0; i < 20000; i++) { db.numbers.save({num: i}); } São muitos documentos, então, não se surpreenda se a inserção demorar alguns segundos para processar. Assim que retornar, você pode executar algumas consultas para veri�car se todos os documentos estão presentes: Conceitos de OtimizaçãoConceitos de Otimização de Consultasde Consultas 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 31/48 db.numbers.count() db.numbers.find() Com um conjunto considerável de documentos disponíveis, vamos tentar algumas consultas. Dado que você sabe sobre o mecanismo de consulta do MongoDB, uma consulta simples, que corresponde a um documento na coleção, pode informar o número do documento: db.numbers.find({num: 500}) Range Queries Você também pode emitir consultas de intervalo usando os operadores $gt e $lt. Eles representam maior que e menor que, respectivamente. É assim que você consulta, para todos os documentos, um valor com num maior que 199.995: db.numbers.find({num: {"$gt": 19995 }}) Você também pode combinar os dois operadores para especi�car os limites superior e inferior: db.numbers.find( {num: {"$gt": 20, "$lt": 25 }} ) Você pode ver que, usando um documento JSON simples, é possível especi�car um intervalo de consulta da mesma forma que você faria no SQL. $gt e $lt são apenas dois de uma série de operadores que compõem a linguagem de consulta MongoDB. Outros incluem $gte para maior que ou igual a, $lte para (você adivinhou) menor ou igual a, e $ne para não igual. Você verá outros operadores e muitos mais exemplos de consultas em capítulos posteriores. Obviamente, consultas como essa têm pouco valor, a menos que também sejam e�cientes. Na próxima seção, começaremos a pensar sobre a e�ciência da consulta, explorando o MongoDB recursos de indexação. Indexação e Explain Se você já passou algum tempo trabalhando com bancos de dados relacionais, provavelmente está familiarizado com EXPLAIN do SQL, uma ferramenta inestimável para depurar ou otimizar uma consulta (BAHGA; MADISETTI, 2016). Quando o banco de dados recebe uma consulta, deve planejar 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 32/48 como executá-la, isso é chamado de consulta plano. EXPLAIN descreve caminhos de consulta e permite aos desenvolvedores diagnosticar operações lentas, determinando quais índices uma consulta usou. Frequentemente, uma consulta pode ser executada de várias maneiras e, às vezes, isso resulta em um comportamento inesperado. O MongoDB tem sua própria versão do EXPLAIN, que fornece o mesmo serviço. Para ter uma ideia de como isso funciona, vamos aplicar o EXPLAIN a uma das consultas que você acabou de enviar. Tente executar o seguinte em seu sistema: db.numbers.find({num: {"$gt": 19995 }}).explain("executionStats") Ao examinar a saída de explain(), você pode se surpreender ao ver que a consulta percorre toda a coleção, todos os 20.000 documentos (docsExamined), para retornar apenas quatro resultados (nRetornado). O valor do campo totalKeysExamined mostra o número de entradas de índice veri�cadas, que é zero. Que grande diferença entre o número de documentos percorridos e o número retornado, isso é considerado como uma consulta ine�ciente. Em uma situação do mundo real, em que a coleção e os documentos próprios provavelmente seriam maiores, o tempo necessário para processar a consulta seria substancialmente maior do que os oito milissegundos (ms) observados aqui (isso pode ser diferente em sua máquina). O que essa coleção precisa é de um índice. Você pode criar um índice para a tecla num dentro dos documentos usando o método createIndex(). Tente inserir o seguinte código de criação de índice: db.numbers.createIndex({num: 1}) O método createIndex() substitui o método assegureIndex() no MongoDB 3. Se você está usando uma versão mais antiga do MongoDB, deve usar assegureIndex() em vez de createIndex(). No MongoDB 3, verifyIndex() ainda é válido, pois é um alias para createIndex(), mas você deve parar de usá-lo. Tal como acontece com outras operações MongoDB, como consultas e atualizações, você passa um documento ao método createIndex() para de�nir as chaves do índice. Nesse caso, o {num: 1} documento indica que um índice crescente deve ser construído na tecla num para todos documentos na coleção de números. Você pode veri�car se o índice foi criado chamando o método getIndexes(): db.numbers.getIndexes() A coleção agora tem dois índices. O primeiro é o índice _id padrão que é automaticamente construído para cada coleção; o segundo é o índice que você criou em num. Os índices para esses campos são chamados de _id_ e num_1, respectivamente. Se você não fornecer um nome, o MongoDB con�gura automaticamente nomes signi�cativos. Se você executar sua consulta com o método explain(), verá, agora, a diferença dramática no tempo de resposta da consulta, conforme mostrado na lista a seguir. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 33/48 db.numbers.find({num: {"$gt": 19995 }}).explain("executionStats") Agora que a consulta utiliza o índice num_1 em num, ela veri�ca apenas os quatro documentos relativos à consulta. Isso reduz o tempo total para atender a consulta de 8 ms para 0 ms! Os índices não são gratuitos (BAHGA; MADISETTI, 2016); eles ocupam algum espaço e podem fazer suas inserções ligeiramente mais caras, mas são ferramentas essenciais para a otimização de consulta (BANKER et al., 2016). A seguir, você verá os comandos administrativos básicos necessários para obter informações sobre sua instância do MongoDB. Você também aprenderá técnicas para obter ajuda do shell, o que ajudará a dominar os vários comandos. Você não precisa decorar os comandos, mas sim entender como eles funcionam e quais objetivos eles atendem. Dessa forma, seu aprendizado torna-se mais intuitivo e prazeroso. praticar Vamos Praticar saiba maisSaiba mais Um local muito importante para aprender os comandos que podem ser utilizados no shell do MongoDB é a sua universidade. Lá, além dos comandos, você aprenderá muitos recursos que estão disponíveis para este banco de dados. Fonte: MongoDB University (2020). Para isso, acesse o link a seguir: ACESSAR https://university.mongodb.com/ 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 34/48 Aprendemos como inserir documentos em coleções e como recuperá-los de maneira e�ciente. Uma consulta mais complexa pode acomodar diversos predicados de buscas. Isso deve ser considerado no momento da criação da consulta para evitar erros e manter o desempenho adequado. Para isto, escreva uma consulta com AND implícito que retorne o documento contendo o username = “everton”, criado pelo seguinte comando: db.users.insert({username: "everton"}). Feedback: Ao montar a sua consulta, o resultado deve ser parecido com o código a seguir. Desta forma, o AND �ca implícito de acordo com os predicados, separados por vírgula. Deve-se notar que o valor do ObjectId deve ser especi�cado. db.users.find({ _id: ObjectId("5fbae86f5da1a87e9fcd383d"), username: "everton" }) 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 35/48 Quando instalamos o banco de dados, realizamos algumas con�gurações básicas.Entretanto, em alguns cenários, elas não são o su�ciente e precisam ser ajustadas. Para isso, é necessário obter algumas informações do banco de dados para poder realizar tais ajustes de forma mais precisa. Vamos ver como obter algumas informações importantes para a administração do MongoDB e como utilizá-las em alguns cenários. Administração Básica Você já aprendeu os fundamentos da manipulação e indexação de dados. Aqui, nós vamos apresentar técnicas para obter informações sobre o processo mongod. Por exemplo, você provavelmente vai querer saber a quantidade de espaço que suas várias coleções estão ocupando, ou quantos índices você de�niu em uma determinada coleção. Os comandos detalhados aqui podem ajudá-lo a diagnosticar problemas de desempenho e manter guias em seus dados. Con�gurações de BancosCon�gurações de Bancos de Dados Não Relacionaisde Dados Não Relacionais 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 36/48 Também veremos a interface de comando do MongoDB. A maioria dos comandos não CRUD pode ser realizada em uma instância do MongoDB, a partir de veri�cações de status do servidor, veri�cações de integridade de arquivo de dados são implementados usando comandos de banco de dados. Além disso, visualizar quais comandos estão no contexto do MongoDB e mostrar como eles são fáceis de usar é útil. Por �m, é sempre bom saber onde procurar ajuda. Para esse �m, vamos apontar lugares no shell onde você pode pedir ajuda para continuar a sua exploração de MongoDB. Obtendo Informações do Banco de Dados Frequentemente, você vai querer saber quais coleções e bancos de dados existem em uma determinada instalação (BANKER et al., 2016). Felizmente, o shell do MongoDB fornece uma série de comandos, junto com alguns açúcares sintáticos, para obter informações sobre o sistema. Por exemplo, o show dbs mostra uma lista de todos os bancos de dados no sistema: show DBS Para mostrar coleções e exibir uma lista de todas as coleções de�nidas no banco de dados atual, podemos usar um comando. Se o banco de dados test ainda estiver selecionado, você verá uma lista das coleções que trabalhamos no tutorial anterior: show collections reflitaRe�ita Uma boa administração de um banco de dados permite com que o seu banco de dados �que estável e responda bem às demandas de usuários. Além disso, é importante para entender o comportamento do mesmo e evitar surpresas como acessos não autorizados. Dessa forma, como você pode administrar um banco de dados para atender eventuais questões da Lei Geral de Proteção de Dados (LGPD)? 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 37/48 A única coleção que você pode não reconhecer é system.indexes. Esta é uma coleção especial que existe para cada banco de dados. Cada entrada em system.indexes de�ne um índice do banco de dados que você pode ver usando o método getIndexes(), estudado anteriormente. Mas o MongoDB 3.0 torna obsoleto o acesso direto às coleções system.indexes; você deve usar createIndexes e listIndexes em vez disso. O getIndexes() Java-O método de script pode ser substituído pelo db.runCommand ({"listIndexes": "números"}) comando shell. Para uma visão de nível inferior em bancos de dados e coleções, o método stats() se prova útil. Ao executá-lo em um objeto de banco de dados, você obterá a seguinte saída: db.stats() Você também pode executar o comando stats() em uma coleção individual: db.numbers.stats() Alguns dos valores fornecidos nestes documentos de resultado são úteis apenas em casos complicados, situações de depuração ou ajuste. Mas, pelo menos, você será capaz de descobrir quanto espaço uma determinada coleção e seus índices estão ocupando. Conseguindo Ajuda Até agora, utilizamos o shell do MongoDB como um local de testes para experimentar dados e administração do banco de dados. Mas por você provavelmente passar muito tempo dentro desta estrutura, vale a pena saber como conseguir ajuda. Os comandos de ajuda integrados são os primeiros lugares a serem examinados. db.help() mostra uma lista de métodos comumente usados para operar em bancos de dados. Você encontrará uma lista semelhante de métodos para operar em coleções executando db.numbers.help(). Também há preenchimento de guia integrado. Comece digitando os primeiros caracteres de qualquer método e pressione a tecla TAB duas vezes. Você verá uma lista de todos os métodos de correspondência. Aqui está o comando que exibe os métodos de coleta começando com get: db.numbers.get O manual o�cial do MongoDB é um recurso inestimável de informações. Ele tem tutoriais e materiais de referência, além disso, é mantido atualizado com novos lançamentos do MongoDB. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 38/48 O manual também inclui documentação para cada implementação de driver MongoDB especí�ca de linguagem, como o driver Ruby, que é necessário ao acessar o MongoDB a partir de um aplicativo. Se você é mais ambicioso e se sente confortável com JavaScript, o shell o torna fácil de examinar a implementação de qualquer método. Por exemplo, suponha que você gostaria de saber exatamente como o método save() funciona. Claro, você poderia ir pescar por meio do código-fonte do MongoDB, mas há uma maneira mais fácil: insira o nome do método sem os parênteses de execução. Aqui está como você normalmente executaria save(): db.numbers.save ({num: 123123123}) E é assim que você pode veri�car a implementação: db.numbers.save Leia a de�nição da função com atenção e você verá que save() é apenas um invólucro para insert() e update(). Depois de veri�car o tipo de argumento obj, se o objeto que você está tentando salvar não tem um campo _id, então, o campo é adicionado e insert() é invocado. Caso contrário, uma atualização é realizada. Esse truque para examinar os métodos do shell é útil. Mantenha essa técnica em mente à medida que você explora o shell do MongoDB. function ( obj , opts ){ if ( obj == null ) saiba maisSaiba mais Sempre que trabalhamos com ferramentas, é interessante ler a documentação o�cial. Ela contém todos os detalhes de utilização e é sempre um excelente ponto de partida. Para isso, acesse a documentação do MongoDB que está disponível na URL a seguir. Fonte: MongoDB (2020b). ACESSAR http://docs.mongodb.org/ 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 39/48 throw "can't save a null"; if ( typeof( obj ) == "number" || typeof( obj) == "string" ) throw "can't save a number or string" if ( typeof( obj._id ) == "undefined" ){ obj._id = new ObjectId(); return this.insert( obj , opts ); } else { return this.update( { _id : obj._id } , obj , Object.merge({upsert:true }, opts)); } } Leia a de�nição da função com atenção e você verá que save() é apenas um invólucro para insert() e update(). Depois de veri�car o tipo, você agora viu o modelo de dados do documento na prática e demonstramos uma variedade de operações MongoDB comuns nesse modelo de dados. Claro que você não precisa decorar essas funções, basta saber o que ela faz e como foi implementada. Mas isso é importante para você ver a capacidade da linguagem JavaScript dentro do MongoDB. praticar Vamos Praticar O desempenho de consultas é um requisito muito importante para manter uma boa resposta para os usuários do banco de dados. O MongoDB proporciona uma forma de otimizar consultas em coleções com muitos documentos pela utilização de índices. A indexação faz parte de um bom design de banco de dados. Neste caso, como podemos indexar a consulta para que melhore o desempenho de recuperação dos dados criados pelo comando a seguir? 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I…40/48 for(i = 0; i < 20000; i++) { db.numbers.save({num: i}); } Feedback: Para isto, podemos indexar a coleção utilizando o comando: db.numbers.createIndex({num: 1}) Se tudo der certo, vamos receber o retorno do MongoDB da seguinte forma: { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 41/48 indicações Material Complementar F ILME A Rede Social Ano: 2010 Comentário: este �lme aborda o assunto de mídias sociais pela perspectiva da mais conhecida delas, o Facebook. Por mais interessante que seja a história por trás da rede, é importante lembrar que ela não seria possível sem um banco de dados NoSQL, como o MongoDB. Fonte: Sony Pictures Portugal (2010). Para conhecer mais sobre o �lme, acesse o trailer disponível em: TRAIL ER 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 42/48 L IVRO MongoDB: Construa novas aplicações com Novas Tecnologias Editora: Casa do Código Autor: Fernando Boaglio ISBN: B019OZ902U Comentário: este livro traz uma visão simples de como construir aplicações modernas utilizando o MongoDB. Aborda assuntos como con�guração de acesso, CRUD, monitoramento e otimização. Além disso, é um bom começo para entender como o MOngoDB pode ser utilizado para construção de apps. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 43/48 conclusão Conclusão Você aprendeu a criar índices e viu um exemplo de melhorias de desempenho baseadas em índice através do uso de explain(). Além disso, você deve ser capaz de extrair informações sobre as coleções e bancos de dados em seu sistema; agora, você sabe tudo sobre a coleção $cmd, e se precisar de ajuda, você aprendeu alguns truques para encontrar seu caminho ao redor. Você pode aprender muito trabalhando no shell do MongoDB, mas não há substituto para a experiência de construir um aplicativo real. Além disso, agora, você é capaz de realizar as operações CRUD, indexação e algumas tarefas básicas de administração de banco de dados. Adicionalmente, alguns princípios de design para os modelos de documentos também foram apresentados em um contexto de comércio eletrônico. Esperamos que tenha sido útil o caminho percorrido até aqui. referências Referências Bibliográ�cas BAHGA, A.; MADISETTI, V. Big Data Analytics: A Hands-On Approach. Califórnia: Arshdeep Bahga & Vijay Madisetti, 2016. BANKER, K. et al. MongoDB in Action. 2. ed. Nova Iorque: Manning Publications Co., 2016. BOAGLIO, F. MongoDB: Construa novas aplicações com novas tecnologias. São Paulo: Casa do Código, 2020. CAMPELLO, B.; CALDEIRA, P. D. T. Introdução às Fontes de Informação. 3. ed. Belo Horizonte: Autêntica, 2014. CONNOLLY, T.; BEGG, C. Database Systems: A Practical Approach to Design, Implementation, and Management. 6. ed. Nova Iorque: Person, 2019. 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 44/48 CORONEL, C., MORRIS, S. Database Systems: Design, Implementation, and Management. 11. ed. Nova Iorque: Cengage Learning, 2015. CREATIVE COMMONS. Bson [2020]. Página inicial. Disponível em: http://bsonspec.org./. Acesso em: 2 dez. 2020. DOCUMENTS. Docs MongoDB, [2020a]. Disponível em: https://docs.mongodb.com/manual/core/document/. Acesso em: 2 dez. 2020. GET started with MongoDB. Docs MongoDB, [2020b]. Disponível em: https://docs.mongodb.com/. Acesso em: 2 dez. 2020. MONGODB Community Server. MongoDB, [2020]. Disponível em: https://www.mongodb.com/try/download/community. Acesso em: 2 dez. 2020. MONGODB. MongoDB University, [2020]. Disponível em: https://university.mongodb.com/. Acesso em 2 dez. 2020. TRAILER O�cial Português - A REDE SOCIAL. [S. l.: s. n.], 2010. 1 vídeo (2m). Publicado pelo canal Sony Pictures Portugal. Disponível em: https://www.youtube.com/watch?v=6VtX6przSlI. Acesso em: 2 dez. 2020. http://bsonspec.org./ https://docs.mongodb.com/manual/core/document/ https://docs.mongodb.com/ https://www.mongodb.com/try/download/community https://university.mongodb.com/ https://www.youtube.com/watch?v=6VtX6przSlI 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 45/48 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 46/48 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 47/48 05/03/2021 Ead.br https://uniritter.blackboard.com/webapps/late-course_content_soap-BBLEARN/Controller?ACTION=OPEN_PLAYER&COURSE_ID=_684922_1&PARENT_I… 48/48
Compartilhar