Ao terminar esta aula, você vai conseguir
- Relacionar create, read, update e delete aos métodos do MongoDB
- Atualizar campos com operadores sem substituir o documento
- Conferir o alvo antes de alterar ou remover dados
CRUD reúne quatro operações: create, read, update e delete. Em português, criar, ler, atualizar e remover. Nesta aula, você vai ligar cada ação a métodos do MongoDB e adotar uma regra de segurança: tornar o alvo visível antes de executar uma escrita.
Pense numa ficha de matrícula. Você abre uma ficha nova, consulta uma existente, corrige um campo ou cancela a ficha. O identificador garante que a mudança chegue à pessoa certa. No MongoDB, o documento ocupa esse papel e o filtro escolhe quais documentos participam. A analogia termina aí: uma operação pode atingir muitos documentos de uma vez, e uma remoção no banco não vai para uma lixeira automática.
Crie e leia a confirmação
No mongosh, a criação de um curso pode usar insertOne:
const resultado = db.cursos.insertOne({
titulo: 'JavaScript essencial',
status: 'rascunho',
vagas: 30
})
resultado.insertedIdO resultado traz o _id inserido. Guarde ou use esse identificador para
confirmar a leitura:
db.cursos.findOne({ _id: resultado.insertedId })findOne devolve um documento ou null. Essa diferença importa: null indica
que nenhum documento correspondeu ao filtro, não que houve uma lista vazia.
Em uma API, essa situação costuma virar resposta 404; falha de conexão é outro
tipo de erro e não deve ser tratada como “não encontrado”.
Atualize campos com operadores
Para publicar o curso sem substituir os demais campos, use $set:
db.cursos.updateOne(
{ _id: resultado.insertedId },
{ $set: { status: 'publicado' } }
)O primeiro documento é o filtro; o segundo descreve a atualização. Um erro
reproduzível é esquecer o operador e tentar
updateOne({ _id }, { status: 'publicado' }). Em atualizações desse tipo, o
servidor exige operadores atômicos e rejeita o documento de atualização. Se a
intenção fosse substituir tudo, existiria replaceOne, mas os campos omitidos
seriam perdidos.
Confira matchedCount e modifiedCount. Um documento pode ser encontrado sem
ser modificado, por exemplo quando status já tem o valor pedido. Esses números
respondem perguntas diferentes e ajudam a não anunciar uma mudança inexistente.
Escolha conscientemente entre os sufixos One e Many. updateOne altera no
máximo um documento correspondente; updateMany percorre todos os
correspondentes. O nome do método é parte da intenção, mas o filtro continua
decisivo. Para publicar uma turma específica, combine identificador e estado.
Para arquivar todos os cursos encerrados, um filtro por data pode justificar a
operação em lote. Antes, conte e amostre os documentos atingidos.
Existe também a opção upsert, que insere quando nenhum documento corresponde.
Ela é útil quando a regra realmente é “atualize ou crie”, mas perigosa como
atalho. Um erro de digitação no filtro pode criar uma segunda entidade em vez
de revelar que a primeira não foi encontrada. Use chave única e confira
upsertedId quando esse comportamento fizer parte do requisito.
Remova com um filtro que você consegue explicar
Primeiro faça a leitura, depois a exclusão:
const filtro = { _id: resultado.insertedId, status: 'rascunho' }
db.cursos.findOne(filtro)
db.cursos.deleteOne(filtro)Incluir o estado esperado evita remover um curso que outra ação já publicou.
deleteOne({}) removeria algum documento correspondente ao filtro vazio; já
deleteMany({}) alcançaria a coleção inteira. Nunca use filtro vazio por
conveniência. Em dados importantes, pense também em permissão, backup, auditoria
e numa estratégia de arquivamento.
Em chamadas de aplicação, trate falhas separadamente. Uma contagem zero é um resultado válido; timeout, falta de permissão e documento inválido são erros. Misturá-los numa única mensagem “não deu certo” impede o usuário de corrigir a entrada e impede a equipe de diagnosticar a infraestrutura.
O laboratório desta aula é somente um simulador didático de filtros JSON. Ele
não escreve, não persiste e não representa concorrência ou confirmação de um
servidor MongoDB. Use $ne para ocultar arquivados e depois refine com
{"titulo":"CSS responsivo"}. O resultado deve cair de três para um.
Sua missão é escrever as quatro operações para um curso de teste e, depois de
cada uma, anotar a prova esperada: _id criado, documento lido, contagem
modificada ou contagem removida. Na próxima aula, vamos ampliar os filtros sem
perder essa disciplina de prever o resultado.
Laboratório ao vivo
Confira o alvo antes da escrita
Filtre os itens não arquivados e refine até um único título. O simulador só lê JSON no navegador; não executa insert, update ou delete em MongoDB real.
Resultado
Pare e pense
Qual prática reduz o risco antes de um updateMany ou deleteMany?
Ler com o mesmo filtro torna o alcance visível. Depois você pode refinar o critério e só então executar a escrita intencionalmente.
Faça sem copiar
Escreva insertOne, findOne, updateOne com $set e deleteOne para um curso de teste. Em cada operação, defina como confirmar o resultado sem usar filtro vazio.
Fontes para consultar
Terminou a missão?
Marque apenas quando você conseguir explicar o conceito e concluir o desafio. O progresso fica salvo somente neste navegador.
Próxima: Consultas MongoDB com filtros, projeção e paginação →