Перейти к основному содержимому

Обновление нескольких полей в документе MongoDB

· 6 мин. чтения

1. Обзор

MongoDB — это общедоступная база данных NoSQL, ориентированная на документы. Мы можем обновлять документы в коллекции, используя различные методы, такие как обновление , замена и сохранение . Чтобы изменить конкретное поле документа, мы будем использовать разные операторы, такие как $set , $inc и т. д.

В этом руководстве мы научимся изменять несколько полей документа, используя запрос на обновление и замену . В демонстрационных целях мы сначала обсудим запрос оболочки mongo, а затем его соответствующую реализацию на Java.

Давайте теперь рассмотрим различные методы для достижения цели.

2. Запрос оболочки для обновления разных полей

Прежде чем мы начнем, давайте сначала создадим новую базу данных, foreach , и образец коллекции, employee . Мы будем использовать эту коллекцию во всех примерах:

use foreach;
db.createCollection(employee);

Теперь добавим в эту коллекцию несколько документов с помощью запроса insertMany :

db.employee.insertMany([
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Representative",
"department_id": 2,
"salary": 20000,
"hire_date": NumberLong("1643969311817")
},
{
"employee_id": 794876,
"employee_name": "Joe Butler",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1645338658000")
}
]);

В результате мы получим JSON с ObjectId для обоих документов, как показано ниже:

{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}

На данный момент мы создали необходимую среду. Давайте теперь обновим документы, которые мы только что вставили.

2.1. Обновление нескольких полей одного документа

Мы можем использовать операторы $set и $inc для обновления любого поля в MongoDB. Оператор $set установит новое указанное значение, а оператор $inc увеличит значение на указанное значение.

Давайте сначала рассмотрим запрос MongoDB для обновления двух полей коллекции сотрудников с помощью оператора $set :

db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);

В приведенном выше запросе поля employee_id и employee_name используются для фильтрации документа, а оператор $set используется для обновления полей job и Department_id .

Мы также можем использовать операторы $set и $inc вместе в одном запросе на обновление:

db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);

Это изменит поле вакансии на « Менеджер по продажам» и увеличит « department_id » на 1.

2.2. Обновление нескольких полей нескольких документов

Кроме того, мы также можем обновлять несколько полей более чем одного документа в MongoDB. Нам просто нужно включить параметр multi:true , чтобы изменить все документы, соответствующие критериям запроса фильтра:

db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);

В качестве альтернативы мы получим те же результаты, используя запрос updateMany :

db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);

В приведенном выше запросе мы использовали метод updateMany для обновления более 1 документа коллекции.

2.3. Распространенная проблема при обновлении нескольких полей

До сих пор мы научились обновлять несколько полей с помощью запроса на обновление, предоставляя два разных оператора или используя один оператор для нескольких полей.

Теперь, если мы используем оператор несколько раз с разными полями в одном запросе, MongoDB обновит только последний оператор запроса на обновление и проигнорирует остальные:

db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);

Приведенный выше запрос вернет результат, аналогичный этому:

{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}

В этом случае единственная вакансия будет обновлена до «Менеджер по продажам». Значение Department_id не будет обновлено до 3.

3. Обновите поля с помощью драйвера Java

До сих пор мы обсуждали необработанные запросы MongoDB. Давайте теперь выполним те же операции, используя Java . Драйвер Java MongoDB поддерживает два класса для представления документа MongoDB: com.mongodb.BasicDBObject и org.bson.Document. Мы рассмотрим оба метода обновления полей в документе.

Прежде чем мы продолжим, давайте сначала подключимся к коллекции сотрудников внутри базы данных foreach :

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("foreach");
MongoCollection<Document> collection = database.getCollection("employee");

Здесь мы предположили, что MongoDB работает локально на порту по умолчанию 27017.

3.1. Использование DBObject

Чтобы создать документ в MongoDB, мы будем использовать файл com.mongodb. Интерфейс DBObject и класс его реализации com.mongodb.BasicDBObject .

Реализация DBObject основана на парах ключ-значение. BasicDBObject унаследован от класса LinkedHashMap , который находится в пакете util .

Теперь давайте используем com.mongodb.BasicDBObject для выполнения операции обновления нескольких полей:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

Здесь, во-первых, мы создали фильтрующий запрос на основе employee_id. Эта операция вернет набор документов. Далее мы обновили значение Department_id и job в соответствии с заданным запросом.

3.2. Использование документа bson

Мы можем выполнять все операции MongoDB, используя документ bson . Для этого сначала нам понадобится объект коллекции, а затем выполните операцию обновления с помощью метода updateMany с функциями фильтра и набора .

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Здесь мы передаем фильтр запроса в метод updateMany . Фильтр eq сопоставляет employee_id с точным соответствием текста «794875». Затем мы обновляем Department_id и задание с помощью оператора set .

4. Использование запроса на замену

Наивный подход к обновлению нескольких полей документа состоит в том, чтобы заменить его новым документом с обновленными значениями.

Например, если мы хотим заменить документ с employee_id 794875, мы можем выполнить следующий запрос:

db.employee.replaceOne(
{
"employee_id": 794875
},
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Manager",
  "department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1643969311817")
}
);

Приведенная выше команда напечатает подтверждение JSON на выходе:

{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}

Здесь поле employee_id используется для фильтрации документа. Второй аргумент запроса на обновление обозначает документ, из которого будет заменен существующий документ.

В приведенном выше запросе мы выполняем replaceOne , следовательно, он заменит только один документ с этим фильтром. В качестве альтернативы, если мы хотим заменить все документы этим фильтрующим запросом, нам нужно будет использовать метод updateMany .

5. Вывод

В этой статье мы рассмотрели различные способы обновления нескольких полей документа в MongoDB. Мы подробно обсудили две реализации: с использованием оболочки MongoDB и с использованием драйвера Java.

Существуют различные варианты обновления нескольких полей документа, включая операторы $inc и $set .

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub .