SQL vs Mongo - Operações básicas

Um comparativo entre as operações básicas no SQL e seus equivalentes no Mongo

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 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

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!