MongoDB: Inserir, Buscar, Atualizar e Remover
1 min de leitura
CRUD no MongoDB segue um padrão limpo: uma coleção, um método
por operação, sempre recebe um filtro ou um documento. Vamos
cobrir mongosh e o driver Node lado a lado.
Create: inserir documentos
// mongosh
db.usuarios.insertOne({ nome: "Ana", idade: 28 });
db.usuarios.insertMany([
{ nome: "Bruno", idade: 35 },
{ nome: "Carla", idade: 42 }
]);
// Node
await usuarios.insertOne({ nome: "Ana", idade: 28 });
await usuarios.insertMany([
{ nome: "Bruno", idade: 35 },
{ nome: "Carla", idade: 42 }
]);
insertOne devolve { acknowledged, insertedId }. insertMany
devolve { acknowledged, insertedCount, insertedIds }.
Read: buscar documentos
A busca é sempre via find(). Sem filtro = todos os documentos:
// mongosh
db.usuarios.find(); // todos
db.usuarios.findOne({ nome: "Ana" }); // um específico
// Node
const todos = await usuarios.find().toArray();
const ana = await usuarios.findOne({ nome: "Ana" });
O filtro é um documento de match - cada campo é uma condição de igualdade (a não ser que use operadores, que vem no próximo nó).
Update: atualizar documentos
Atenção ao detalhe: o MongoDB tem dois pares de update - um substitui o documento inteiro, o outro modifica campos específicos.
// $set: atualiza só os campos passados
db.usuarios.updateOne(
{ nome: "Ana" }, // filtro
{ $set: { idade: 29 } } // modificação
);
db.usuarios.updateMany(
{ ativo: true },
{ $set: { newsletter: true } }
);
// substitui o documento inteiro (perigoso se esquecer campos)
db.usuarios.replaceOne(
{ nome: "Ana" },
{ nome: "Ana", idade: 30 } // ⚠️ só tem esses campos agora
);
A diferença:
updateOne/updateManycom$set= merge - mantém os outros campos.replaceOne= substitui o documento inteiro, perdendo campos não listados.
Pra evitar perda de dado, prefira $set quase sempre.
Delete: remover documentos
// mongosh
db.usuarios.deleteOne({ nome: "Ana" });
db.usuarios.deleteMany({ ativo: false });
// Node
await usuarios.deleteOne({ nome: "Ana" });
await usuarios.deleteMany({ ativo: false });
Cuidado: deleteMany({}) (sem filtro) apaga a coleção inteira.
Sempre confira o filtro antes de rodar.
Operadores comuns em filtro
// comparação
{ idade: { $gt: 18 } } // maior que
{ idade: { $gte: 18, $lt: 65 } } // entre
{ nome: { $in: ["Ana", "Bruno"] } } // está na lista
// lógicos
{ $and: [{ ativo: true }, { idade: { $gte: 18 } }] }
{ $or: [{ premium: true }, { admin: true }] }
// existência
{ email: { $exists: true } } // tem o campo
{ telefone: { $exists: false } } // não tem
Três conceitos pra fixar:
updateOnecom$seté o caminho seguro - atualiza campos sem perder os outros.find()sempre devolve coleção;.toArray()no driver Node materializa aCursorem array de documentos.- Filtros são documentos -
{ campo: valor }ou{ campo: { $operador: valor } }pra condições além de igualdade.
Dica: o driver Node tem um método
find()que devolveCursor, não array direto. Esquecer o.toArray()é fonte comum de bug ("por que meuawaitresolve numa coisa que não dá pra usar?").
No próximo nó, vamos além do CRUD básico: filtros compostos, projeção, ordenação, paginação e agregação.