SQL vs Mongo - Operações básicas
De acordo com uma pesquisa do StackOverflow feita em 2019 (o link pode ser visto aqui), os quatro bancos de dados mais populares eram todos SQL, sendo o Mysql o primeiro da lista. Na quinta colocação no ranking da popularidade temos o Mongo. Cerca de 25% dos usuários deste site afirmam que utilizam o Mongo nos seus projetos.
O que é Mongo?
O Mongo é um banco de dados não relacional. Ao contrário do SQL que é baseado em tabelas, o Mongo guarda os dados em coleções. Cada registro é chamado de documento.
Para quem já trabalha com SQL, o primeiro contato com o Mongo pode não ser amistoso. Se você tem um conhecimento básico de Mongo e domina SQL, este texto é para você. Vamos ver alguns exemplos de operações básicas no SQL e a forma de escrever as mesmas no Mongo.
Criar tabela/coleção
SQL
CREATE TABLE alunos (id MEDIUMINT NOT NULL AUTO_INCREMENT, nome varchar(50), email varchar(50), idade number, status number, PRIMARY KEY (id)
Mongo
db.createCollection("alunos")
As coleções do Mongo podem ser criadas informando apenas o nome da coleção, a estrutura do que vai ser armazenado dentro dela não é informada.
Adicionar campo na tabela/coleção
SQL
ALTER TABLE alunos ADD data_cadastro DATETIME
Mongo
db.alunos.updateMany( { }, { $set: { data_cadastro: new Date() } } )
Excluir campo na tabela/coleção
SQL
ALTER TABLE alunos DROP COLUMN data_cadastro
Mongo
db.alunos.updateMany( { }, { $unset: { "data_cadastro": "" } } )
Comparando as operação de adicionar campo e remover campo, você percebe que no Mongo se utilizou o operador $set para adicionar o campo e $unset para remover. Não houve mudança no método.
Inserir dados
SQL
INSERT INTO alunos(nome, email, idade, status) VALUES ("Bins","teste@teste.com.br", 43, 1)
Mongo
db.alunos.insertOne({nome: "Bins", email: idade:"teste@teste.com.br", 43, status: 1})
Uma observação: Quando você adiciona um documento na coleção, será adicionado automaticamente um campo do tipo chave primaria chamado "_id"
Atualizar
SQL
UPDATE alunos SET status = 0 WHERE idade > 25
Mongo
db.alunos.updateMany({ age: { $gt: 25 } }, { $set: { status: "C" } })
Perceba que o método updateMany recebe dois parãmetros, o primeiro é o critério que deve ser atendido, o segundo é a alteração que deve ser feita.
Excluir
SQL
DELETE FROM alunos WHERE status = 0
Mongo
db.alunos.deleteMany( { status: 0 } )
Selecionar
Para retornar dados no Mongo você utiliza o método find
db.NomeColeção.find({condição}, {atributos exibidos ou não})
O primeiro parâmetro filtra documentos que obedecem uma ou mais condições, já o segundo filtra os atributos que serão exibidos ou ocultados do resultado da consulta. Por padrão, ao fazer uma consulta, todos os campos são retornados, então o segundo parâmetro é opcional.
Vamos ver exemplos de alguns tipos de seleção de registros
Selecionar apenas algumas colunas da tabela/coleção
SQL
SELECT nome, email FROM alunos
Mongo
db.alunos.find({},{ nome: 1, email: 1, _id: 0 })
Selecionar dados que sejam iguais ao critério informado
SQL
SELECT * FROM alunos WHERE status = 1
Mongo
db.alunos.find({ status: 1})
Selecionar dados que contenham o critério informado
SQL
SELECT * FROM alunos WHERE nome like "%bins%"
Mongo
db.alunos.find( { nome: { $regex: /bins/ } } )
Perceba que no Mongo utilizamos um operador de expressão regular para selecionar registros que tenham o critério informado em qualquer posição do campo.
Contar registros de acordo com uma condição
SQL
SELECT COUNT(*) FROM alunos WHERE idade > 40
Mongo
db.alunos.count( { idade: { $gt: 40 } } )
Para selecionar os registros maiores que o critério, utilizamos o operador $gt. Se o critério { idade: { $gt: 40 } } não tivesse informado, seria retornando o total de registros da coleção alunos.
Selecionar registros de acordo com um intervalo de valores
SQL
SELECT * FROM alunos WHERE idade between 25 and 50
Mongo
db.alunos.find({ idade: { $gt: 25, $lte: 50 } })
Ordenar resultados
SQL
SELECT * FROM alunos WHERE status = 1 ORDER BY idade ASC
Mongo
db.alunos.find( { status: 1 } ).sort( { idade: 1 } )
Utilizando o método sort, retornamos os campos por ordem de idade. Se o valor de idade for alterado para "-1", os registros serão retornados por ordem decrescente de idade.
Retornando apenas 1 registro de acordo com uma determinada condição.
SQL
SELECT top 1 * FROM alunos WHERE status = 1
SELECT * FROM alunos WHERE status = 1 LIMIT 1
Mongo
db.alunos.findOne({ status: 1 })
Perceba que nos exemplos o método find sempre recebe um objeto contendo o nome do campo que vai ser utilizado para filtrar, e os filtros que devem ser aplicados. Aqui vai uma lista dos operadores mais comuns:
$and – operador lógico AND
$or – operador lógico OR
$not – operador lógico NOT
$gt = maior que
$lt = menor que
$gte = maior ou igual
$lte = menor ou igual
$ne = diferente de
$in = todos os documentos cujo atributo possui um dos valores especificados (no SQL isto equivale ao operador IN)
$nin = todos os documentos cujo atributo não possui um dos valores especificados (no SQL isto equivale ao operador NOT IN)
Este artigo não termina aqui. Confira também como funcionam as consultas com agrupamento no SQL e no Mongo!
SQL vs Mongo - consultas com agrupamento