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!