Обновление документов в MongoDB

Последнее обновление: 24.11.2023

Для обновления элементов в MongoDB есть несколько методов:

  • updateOne: обновляет один документ, который соответствует критерию фильтрации, и возвращает информацию об операции обновления

  • updateMany: обновляет все документы, которые соответствуют критерию фильтрации, и возвращает информацию об операции обновления

  • findOneAndUpdate: обновляет один документ, который соответствует критерию фильтрации, и возвращает обновленный документ

findOneAndUpdate

Метод findOneAndUpdate() обновляет один элемент. Он принимает следующие параметры:

  1. Критерий фильтрации документа, который надо обновить

  2. Параметр обновления

  3. Дополнительные опции обновления, которые по умолчанию имеют значение null

  4. Функция обратного вызова, которая выполняется при обновлении

Например, обновим первого пользователя в бд, у которого возраст - 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

Метод 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

Метод 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);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850