Buscar

BANCO DE DADOS APLICADO A BIG DATA - UNIDADE 02

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 48 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 48 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 48 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Continue navegando