Atualizando Documentos no MongoDB com Node.js
Para atualizar elementos no MongoDB, há vários métodos disponíveis:
findOneAndUpdate
: Atualiza um documento que corresponde ao critério de filtro e retorna o documento atualizado.updateOne
: Atualiza um documento que corresponde ao critério de filtro e retorna informações sobre a operação de atualização.updateMany
: Atualiza todos os documentos que correspondem ao critério de filtro e retorna informações sobre a operação de atualização.
findOneAndUpdate
O método findOneAndUpdate()
atualiza um elemento e aceita os seguintes parâmetros:
- Critério de filtro do documento a ser atualizado.
- Parâmetro de atualização.
- Opções adicionais de atualização, que por padrão têm valor
null
. - Função de callback que é executada ao concluir a atualização.
Por exemplo, vamos atualizar o primeiro usuário no banco de dados que tenha 21 anos:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://127.0.0.1:27017/";
const mongoClient = new MongoClient(url);
async function run() {
const users = [
{ name: "Bob", age: 34 },
{ name: "Alice", age: 21 },
{ name: "Tom", age: 45 },
];
try {
await mongoClient.connect();
const db = mongoClient.db("usersdb");
const collection = db.collection("users");
await collection.insertMany(users);
const result = await collection.findOneAndUpdate({ age: 21 }, { $set: { age: 25 } });
console.log(result);
} catch (err) {
console.log(err);
} finally {
await mongoClient.close();
}
}
run().catch(console.error);
Neste exemplo, adicionamos 3 usuários no banco de dados e depois atualizamos um deles.
Para a atualização, usamos o objeto { $set: {age: 25}}
. O parâmetro $set
permite atualizar valores de um campo ou grupo de campos. Neste caso, estamos alterando o campo age
:
const result = await collection.findOneAndUpdate({ age: 21 }, { $set: { age: 25 } });
O método findOneAndUpdate()
retorna o documento atualizado. Por padrão, retorna o estado antigo do documento modificado:
c:\node\mongoapp>node app { _id: new ObjectId("6112ad050d15a6dfd6330280"), name: "Alice", age: 21 }
Obtendo o Novo Estado do Documento Atualizado
Se quisermos obter o novo estado do documento modificado após a atualização, podemos usar a opção adicional returnDocument: "after"
, que indica que devemos receber o novo estado do documento. Por padrão, este parâmetro é before
(ou seja, retorna o estado do documento antes da atualização):
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://127.0.0.1:27017/";
const mongoClient = new MongoClient(url);
async function run() {
try {
await mongoClient.connect();
const db = mongoClient.db("usersdb");
const collection = db.collection("users");
const result = await collection.findOneAndUpdate({ name: "Bob" }, { $set: { name: "Sam" } }, { returnDocument: "after" });
console.log(result);
} catch (err) {
console.log(err);
} finally {
await mongoClient.close();
}
}
run().catch(console.error);
Saída do console:
c:\node\mongoapp>node app { _id: new ObjectId("6113c6c7ed15a6dfd633024e4"), name: "Sam", age: 34 }
updateMany
O método xw permite atualizar todos os documentos na coleção que correspondem ao critério de filtro:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://127.0.0.1:27017/";
const mongoClient = new MongoClient(url);
async function run() {
try {
await mongoClient.connect();
const db = mongoClient.db("usersdb");
const collection = db.collection("users");
const result = await collection.updateMany({ name: "Sam" }, { $set: { name: "Bob" } });
console.log(result);
} catch (err) {
console.log(err);
} finally {
await mongoClient.close();
}
}
run().catch(console.error);
O método updateMany
retorna um objeto descrevendo o resultado da atualização:
{ "acknowledged": true, "modifiedCount": 1, "upsertedId": null, "upsertedCount": 0, "matchedCount": 1 }
A propriedade modifiedCount
indica a quantidade de documentos modificados. A propriedade upsertedId
contém o id do documento adicionado (para operações de substituição com adição). A propriedade upsertedCount
indica a quantidade de linhas adicionadas. E a propriedade matchedCount
mostra a quantidade de documentos que correspondem ao critério de filtro.
updateOne
O método updateOne()
é semelhante ao updateMany
, exceto que atualiza apenas um elemento. Ao contrário do método findOneAndUpdate()
, ele não retorna o documento modificado:
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://127.0.0.1:27017/";
const mongoClient = new MongoClient(url);
async function run() {
try {
await mongoClient.connect();
const db = mongoClient.db("usersdb");
const collection = db.collection("users");
const result = await collection.updateOne({ name: "Tom" }, { $set: { name: "Tom Junior", age: 33 } });
console.log(result);
} catch (err) {
console.log(err);
} finally {
await mongoClient.close();
}
}
run().catch(console.error);