Seminário on-line aberto "Fundamentos do MongoDB"

Amigos, o próximo lançamento do curso Databases será realizado amanhã, por isso realizamos uma aula aberta tradicional, cuja gravação você pode ver aqui . Dessa vez, conversamos sobre o popular banco de dados MongoDB: estudamos algumas das sutilezas, examinamos os conceitos básicos de trabalho, recursos e arquitetura. E também tocou em alguns casos de usuário.



O webinar foi conduzido por Ivan Remen , chefe de desenvolvimento de servidores do Citimobil.


Recursos do MongoDB


O MongoDB é um sistema de gerenciamento de banco de dados orientado a documentos de código-fonte aberto que não requer uma descrição do esquema da tabela. É classificado como NoSQL e usa BSON (JSON binário). Dimensionado para uso imediato, escrito em C ++ e suporta a sintaxe JavaScript. Não há suporte para SQL.

O MongoDB possui drivers para muitas linguagens de programação populares (C, C ++, C #, Go, Java, JavaScript, Perl, PHP, Python, Ruby, etc.). Também existem drivers não oficiais e suportados pela comunidade para outras linguagens de programação.

Bem, vejamos os comandos básicos que podem ser úteis.

Portanto, para implantar o MongoDB no Docker , escrevemos:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

Assim, o cliente MongoDB inicia :



Agora vamos escrever o tradicional Hello World :

 print (“Hello world!”) 



Depois disso, execute o loop :



Como você notou, temos JS regulares à nossa frente e o MongoDB é um intérprete de JavaScript completo .

Quando usar o MongoDB?


Há uma história de que a startup média no Vale do Silício é o homem que abriu o livro "HTML para manequins" há uma semana. Qual pilha ele escolherá? Você deve admitir que é muito conveniente para ele quando ele possui JavaScript no navegador por razões óbvias, o Node.js está sendo executado no servidor e o JavaScript também está no banco de dados. Este é o ponto número 1.

Em segundo lugar, há uma excelente apresentação de Peter Zaitsev, um dos melhores especialistas em banco de dados da Rússia. Nele, Peter fala sobre MySQL e MongoDB, focando quando e o que é melhor usar.

Em terceiro lugar, quero enfatizar que o MongoDB é caracterizado por boa escalabilidade - e esse é um dos principais recursos do banco de dados. Se você não sabe de antemão qual será a carga, o MongoDB é perfeito. Além disso, ele suporta padrões prontos, como sharding e replicação , e tudo isso é bastante transparente, ou seja, é muito conveniente trabalhar.

Quanto à terminologia no MongoDB, então:

  • bases são bases (esquemas, uma totalidade de tabelas);
  • no MongoDB existe uma coleção - é um análogo de uma tabela e um conjunto de documentos que devem ser conectados de acordo com a lógica das coisas;
  • documentos são análogos de uma linha.

Criação de banco de dados e consultas simples


Para criar um banco de dados, você só precisa começar a usá-lo:

 use learn 



Agora faça uma pequena inserção do documento. Que seja, por exemplo, um unicórnio chamado Aurora:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

db é um objeto global para acessar o banco de dados, ou seja, o próprio "monga". Para sharding, sh é usado; para replicação, rs é usado .

Quais comandos o objeto db possui:



Então, voltando à nossa equipe, como resultado, o console relatará que uma linha foi inserida:



A palavra unicorns no db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) designa uma coleção. Observe aqui que não descrevemos ou criamos a coleção, mas simplesmente escrevemos 'unicórnios', inserimos e recebemos uma coleção.

E assim podemos obter todas as nossas coleções :

 db.getCollectionNames() 

Bem e assim por diante. Podemos inserir outra coleção:



Agora, solicitaremos uma coleção completa (lembramos que, no nosso caso, o banco de dados já contém informações sobre dois unicórnios com o mesmo nome):

 db.unicorns.find() 

Observe, aqui está o nosso JSON (existe um nome, sexo, peso, algum identificador exclusivo do objeto):



Agora vamos inserir mais alguns unicórnios com o mesmo nome:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

E vamos ver o que aconteceu:



Como você pode ver, temos campos adicionais: home e worm , que o Aurora não possui.

Adicione mais alguns unicórnios:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

Então, inserimos mais quatro objetos usando JavaScript:



Em quais bancos de dados você acha mais conveniente armazenar dados de passaporte: em bancos de dados relacionais ou em mong?

A resposta é óbvia - em mong, e o exemplo acima mostra bem. Não é nenhum segredo que KLADR é uma dor na Federação Russa. E o monga cai muito bem nos endereços, porque você pode especificar tudo como uma matriz, e será muito mais fácil viver. E este é um bom caso de usuário para o MongoDB .

Adicione mais unicórnios:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



Agora preste atenção aos documentos. Como dob , armazenamos objetos inteiros. E também há informações que o unicórnio ama, e nem todo mundo tem esses dados. Assim, o interior é uma matriz completa .

A propósito, para uma saída mais bonita, você pode chamar o método .pretty() no final do comando search:



Se você precisar obter informações sobre o último erro , use o seguinte comando:

 db.getLastError() 

Isso pode ser feito após cada inserção ou você pode configurar a preocupação de gravação. É melhor ler sobre isso na documentação oficial , que, a propósito, é muito informativa em mong. A propósito, também há um bom artigo sobre o Habré.

Passando para consultas mais complexas


Solicitação do valor exato do campo:

 db.unicorns.find({gender: 'm'}) 

Ao escrever tal solicitação, obtemos na saída no console uma lista de todos os unicórnios do sexo masculino.

Você também pode executar a consulta imediatamente em vários campos : por sexo e por peso:



Acima, preste atenção ao seletor $ gt especial, que permite exibir todos os unicórnios machos com peso superior a 700.

Você pode verificar se o campo existe :

 db.unicorns.find({vampires: {$exists: false}}) 

Ou então:

 db.unicorns.find({'parents.father': {$exists: true}}) 

O comando a seguir exibe unicórnios cujos nomes começam com as letras A ou a:

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

Agora vamos olhar para uma pesquisa de matriz . Pergunta número 1: qual será o resultado deste comando:

 db.unicorns.find({loves:'apple'}) 

É isso mesmo: todo mundo que ama maçãs.

O comando a seguir retornará apenas os dados do unicórnio que contêm apenas maçãs e melancias:

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

E mais um comando:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

No nosso caso, ele não retornará nada, porque quando passamos uma matriz, o primeiro elemento é comparado com o primeiro, o segundo com a segunda, etc. Ou seja, a matriz também deve coincidir nas posições desses valores.

E aqui está a aparência de uma pesquisa de matriz usando o operador OR :



O exemplo a seguir nos mostrará uma pesquisa usando o operador $ all . E aqui a sequência já não tem princípios:



Também podemos pesquisar pelo tamanho da matriz:



Mas e se quisermos encontrar uma matriz maior que uma? Existe um operador $ where para isso, com o qual você pode escrever coisas mais complexas:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

A propósito, se você quiser praticar, aqui está um arquivo com comandos.

Recursos do Cursor


Vamos divagar um pouco e dizer algumas palavras sobre os recursos do monga:

  • find () e outras operações não retornam dados - eles retornam o chamado "cursor";
  • o que vemos quando os dados são impressos é o trabalho do intérprete.

Digitando db.unicorns.find sem parênteses, obtemos uma dica:



Continuamos a atender solicitações


Há também o operador $ in:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



Agora vamos falar sobre atualização . Por exemplo, vamos mudar o peso do unicórnio Roooooodles:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

Como resultado de nossas ações, o documento será completamente atualizado e apenas um campo especificado permanecerá nele:



Ou seja, a única coisa que resta ao nosso objeto é o peso de 2222 e, é claro, o id.

Você pode corrigir isso com $ set :

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




Também é possível incrementar valores :



Há também upsert - uma combinação de atualização e inserção:



E aqui está como selecionar campos :





Resta acrescentar algumas palavras sobre pular e limitar :



Colegas, só isso, se você quiser saber os detalhes, assista ao vídeo inteiro . E não se esqueça de deixar seus comentários!

Source: https://habr.com/ru/post/pt474054/


All Articles