CRUD em Mongoose - Node.js
Vamos examinar como realizar as operações básicas de dados em Mongoose.
Criando Documentos
Em tópicos anteriores, descrevemos de forma geral como criar e adicionar objetos no Mongoose. Especificamente, podemos chamar o método save()
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const userSchema = new Schema({
name: String,
age: Number
});
const User = mongoose.model("User", userSchema);
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
const tom = new User({name: "Tom", age: 34});
// adicionando objeto ao banco de dados
await tom.save();
console.log(tom);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());
Além desse método, também podemos usar o método User.create()
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const userSchema = new Schema({
name: String,
age: Number
});
const User = mongoose.model("User", userSchema);
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
// adicionando objeto ao banco de dados
const user = await User.create({name: "Sam", age: 28});
console.log(user);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());
O método User.create()
Obtendo Dados
Para obter dados, podemos usar uma série de métodos:
: retorna todos os objetos que correspondem ao critério de filtro.find
: retorna um objeto pelo valor do campofindById
._id
: retorna um objeto que corresponde ao critério de filtro.findOne
O método find()
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const userSchema = new Schema({name: String, age: Number});
const User = mongoose.model("User", userSchema);
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
// obtendo todos os objetos do banco de dados
const users = await User.find({});
console.log(users);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());
Se o critério de filtro for um objeto vazio ({})
[
{
"_id": "6377c17b71c0bd75cec4d488",
"name": "Bill",
"age": 41,
"__v": 0
},
{
"_id": "6377c7a46fa33e19ac7a7c41",
"name": "Tom",
"age": 34,
"__v": 0
},
{
"_id": "6377ce352461051cdc78252a",
"name": "Sam",
"age": 28,
"__v": 0
}
]
Vamos alterar o código para obter apenas os usuários cujo nome seja "Tom":
const users = await User.find({name: "Tom"});
O método findOne()
const user = await User.findOne({name: "Bill"});
E o método findById()
const id = "6377c7a46fa33e19ac7a7c41";
const user = await User.findById(id);
Removendo Dados
Para remoção, usamos os métodos deleteOne()
deleteMany()
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const userSchema = new Schema({name: String, age: Number});
const User = mongoose.model("User", userSchema);
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
// removendo todos os objetos do banco de dados com age=41
const result = await User.deleteMany({age: 41});
console.log(result);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());
O método User.deleteMany()
{ "acknowledged": true, "deletedCount": 1 }
O método deleteOne()
const result = await User.deleteOne({name: "Tom"});
console.log(result); // { "acknowledged": true, "deletedCount": 1 }
Para remover um único documento, também podemos usar o método findOneAndDelete()
const user = await User.findOneAndDelete({name: "Sam"});
console.log(user);
Esse método retorna o documento removido:
{ "_id": "6377bca2d16bfca92631cc10", "name": "Sam", "age": 28 }
A versão específica desse método para remoção pelo campo _id
findByIdAndDelete()
const id = "6377c72806fb915eb6621ffd";
const user = await User.findByIdAndDelete(id);
console.log(user);
Atualizando Dados
Para atualizar dados no modelo, utilizamos os métodos updateOne()
updateMany()
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const userSchema = new Schema({name: String, age: Number});
const User = mongoose.model("User", userSchema);
async function main() {
await mongoose.connect("mongodb://127.0.0.1:27017/usersdb");
// Alterando o valor do campo name de "Tom" para "Tom Smith" em todos os documentos
const result = await User.updateOne({name: "Tom"}, {name: "Tom Smith"});
console.log(result);
}
main().catch(console.log).finally(async () => await mongoose.disconnect());
O primeiro parâmetro do método é o critério de filtro. Nesse caso, encontramos todos os usuários com nome "Tom". O segundo parâmetro descreve as alterações a serem feitas. Aqui, estamos mudando o nome para "Tom Smith". O método retorna o resultado da operação de atualização:
{ "acknowledged": true, "modifiedCount": 1, "upsertedId": null, "upsertedCount": 0, "matchedCount": 1 }
O método updateMany
Atualizando pelo ID
Frequentemente, usamos a filtro pelo _id
findByIdAndUpdate()
const id = "6377ce352461051cdc78252a";
const user = await User.findByIdAndUpdate(id, {name: "Sam", age: 25});
console.log(user);
O primeiro parâmetro é o valor do campo _id
{
"_id": "6377ce352461051cdc78252a",
"name": "Sam",
"age": 28,
"__v": 0
}
Por padrão, é retornado o estado antigo do documento. Se precisarmos do documento no estado atualizado, passamos um terceiro parâmetro ao método findByIdAndUpdate
{new: true}
false
const id = "6377ce352461051cdc78252a";
const user = await User.findByIdAndUpdate(id, {name: "Mike", age: 21}, {new: true});
console.log("Objeto atualizado", user);
Se precisamos atualizar e retornar o documento atualizado não apenas pelo ID, mas por qualquer critério, podemos usar o método findOneAndUpdate
const user = await User.findOneAndUpdate({name: "Mike"}, {name: "Alex", age: 24}, {new: true});
console.log("Objeto atualizado", user);
O primeiro parâmetro representa o critério de seleção. O segundo parâmetro representa os valores atualizados do documento. O terceiro parâmetro indica que queremos retornar a versão do documento após a atualização, {new: true}