MongoDB (NoSQL)
Monte comandos do MongoDB com cliques, formate e aprenda a equivalência com SQL
Clique em um comando para inseri-lo no editor, na posição do cursor. Sintaxe do mongosh.
// O resultado aparecerá aqui...
Ajuda: MongoDB e NoSQL
Como usar esta ferramenta
- 1. Escolha uma categoria e clique no comando: ele é inserido no editor na posição do cursor.
- 2. Troque os nomes de exemplo (clientes, pedidos, email...) pelos nomes das suas coleções e campos.
- 3. Clique em Formatar para organizar a indentação. A ferramenta também avisa se faltar fechar chaves, colchetes, parênteses ou aspas.
- 4. Copie e execute no mongosh, no MongoDB Compass (aba Mongosh) ou adapte para o driver da sua linguagem.
- Os comandos usam a sintaxe do mongosh (shell oficial do MongoDB). Nada é executado nem enviado para servidor.
Conceitos do MongoDB
- Banco (database): agrupa coleções, como no SQL.
- Coleção (collection): conjunto de documentos, equivale a uma tabela, mas sem estrutura fixa.
- Documento: registro em formato JSON/BSON, equivale a uma linha. Pode ter objetos e arrays dentro.
- _id: identificador único de todo documento. Se você não informar, o MongoDB gera um ObjectId.
- BSON: formato binário do JSON com tipos extras (ObjectId, Date, Decimal128, Int32, Int64...).
- Schema flexível: documentos da mesma coleção podem ter campos diferentes. Use validação ($jsonSchema) quando precisar de regras.
Equivalência SQL x MongoDB
| SQL | MongoDB |
|---|---|
| Banco | Banco |
| Tabela | Coleção |
| Linha | Documento |
| Coluna | Campo |
| Chave primária | _id |
| JOIN | $lookup ou documento embutido |
| WHERE | filtro do find() / $match |
| GROUP BY | $group |
| ORDER BY | sort() / $sort |
| LIMIT / OFFSET | limit() / skip() |
| Índice | createIndex() |
| Transação | session.startTransaction() |
Exemplos convertidos de SQL para MongoDB
| SQL | MongoDB |
|---|---|
| SELECT * FROM clientes WHERE uf = 'GO' | db.clientes.find({ uf: "GO" }) |
| SELECT nome, email FROM clientes | db.clientes.find({}, { nome: 1, email: 1, _id: 0 }) |
| SELECT * FROM produtos WHERE preco > 100 ORDER BY preco DESC LIMIT 5 | db.produtos.find({ preco: { $gt: 100 } }).sort({ preco: -1 }).limit(5) |
| SELECT COUNT(*) FROM clientes WHERE ativo = 1 | db.clientes.countDocuments({ ativo: true }) |
| INSERT INTO clientes (nome) VALUES ('Ana') | db.clientes.insertOne({ nome: "Ana" }) |
| UPDATE clientes SET ativo = 0 WHERE uf = 'SP' | db.clientes.updateMany({ uf: "SP" }, { $set: { ativo: false } }) |
| DELETE FROM pedidos WHERE status = 'cancelado' | db.pedidos.deleteMany({ status: "cancelado" }) |
| SELECT status, SUM(valor) FROM pedidos GROUP BY status | db.pedidos.aggregate([{ $group: { _id: "$status", total: { $sum: "$valor" } } }]) |
| SELECT * FROM clientes WHERE nome LIKE 'Jo%' | db.clientes.find({ nome: { $regex: "^Jo" } }) |
Modelagem: embutir ou referenciar?
- Embutir (documento dentro de documento) quando os dados são lidos juntos e pertencem ao pai. Ex.: endereço do cliente, itens do pedido.
- Referenciar (guardar o _id de outro documento) quando os dados crescem sem limite, são compartilhados ou mudam com frequência. Ex.: pedidos do cliente, produtos do pedido.
- Um documento tem limite de 16 MB: não embuta arrays que crescem indefinidamente (ex.: todos os logs de um usuário).
- Modele pensando nas consultas mais frequentes da aplicação, não na normalização como no SQL.
Boas práticas
- Antes de updateMany ou deleteMany, rode um find() com o mesmo filtro para conferir o que será afetado.
- Crie índices para os campos usados em filtros e ordenações frequentes; confira com explain("executionStats").
- Use projeção para trazer só os campos necessários.
- Prefira $regex com string ("^jo") a regex literal /jo/: é mais portável entre shell e drivers, e buscas que começam com ^ usam índice.
- Valores monetários: use NumberDecimal (Decimal128), não double.
- Em aplicações, nunca monte filtros concatenando texto digitado pelo usuário; valide os tipos para evitar injeção de operadores ($where, $ne...).
Outros bancos NoSQL
| Tipo | Exemplos | Uso típico |
|---|---|---|
| Documento | MongoDB, CouchDB, Firestore | Cadastros, catálogos, conteúdo flexível |
| Chave-valor | Redis, DynamoDB | Cache, sessões, filas, contadores |
| Colunar | Cassandra, HBase | Grandes volumes de escrita, séries temporais |
| Grafo | Neo4j, Amazon Neptune | Redes sociais, recomendações, rotas |
| Busca | Elasticsearch, OpenSearch | Busca textual, logs e analytics |