Для обновления элементов в MongoDB есть несколько методов:
updateOne: обновляет один документ, который соответствует критерию фильтрации, и возвращает информацию об операции обновления
updateMany: обновляет все документы, которые соответствуют критерию фильтрации, и возвращает информацию об операции обновления
findOneAndUpdate: обновляет один документ, который соответствует критерию фильтрации, и возвращает обновленный документ
Метод findOneAndUpdate() обновляет один элемент. Он принимает следующие параметры:
Критерий фильтрации документа, который надо обновить
Параметр обновления
Дополнительные опции обновления, которые по умолчанию имеют значение null
Функция обратного вызова, которая выполняется при обновлении
Например, обновим первого пользователя в бд, у которого возраст - 21:
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);
Сначала здесь происходит добавление 3 пользователей в базу данных, а после добавления идет обновление.
Для обновления применяется объект { $set: {age: 25}}. Параметр $set позволяет обновить значения для одного поля или группы полей. В данном случае изменяется поле age.
const result = await collection.findOneAndUpdate({age: 21}, { $set: {age: 25}});
Метод findOneAndUpdate()
возвращает результат обновления - обновленный документ. По умолчанию возвращается старое состояние измененного документа:
c:\node\mongoapp>node app { _id: new ObjectId("6112ad050d15a6dfd6330280"), name: "Alice", age: 21 } c:\node\mongoapp>
Но, допустим, после обновления мы хотим получать не старое, а новое состояние измененного документа. Для этого мы можем задать
дополнительну опцию returnDocument: "after"
, которая указывает, что надо получить новое состояние документа. о умолчанию этот параметр имеет значение before
(то есть возвращает
состояние документа ДО обновления):
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);
c:\node\mongoapp>node app { _id: new ObjectId("6113c6c7ed15a6dfd633024e4"), name: "Sam", age: 34 } c:\node\mongoapp>
Метод updateMany() позволяет обновить все документы из коллекции, которые соответствуют критерию фильтрации:
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);
Метод updateMany возвращает объект с описанием результата обновления:
{ acknowledged: true, modifiedCount: 1, upsertedId: null, upsertedCount: 0, matchedCount: 1 }
Свойство modifiedCount
указывает на количество измененных документов. Свойство upsertedId
содержит id добавленного
документа (для операций замены с добавлением). Свойство upsertedCount
содержит количество добавленных строк. А свойство matchedCount
указывает на количество документов, которые соответствуют параметру фильтрации.
Метод updateOne() аналогичен методу updateMany за тем исключением, что обновляет только один элемент. В отличие от метода
findOneAndUpdate()
он не возвращает измененный документ:
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);