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

Массовое обновление документов в MongoDB

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

1. Обзор

В этом руководстве мы рассмотрим выполнение массовых обновлений и операций вставки в MongoDB . Кроме того, MongoDB предоставляет вызовы API, которые позволяют вставлять или извлекать несколько документов за одну операцию. MongoDB использует интерфейсы Array или Batch , которые значительно повышают производительность базы данных за счет уменьшения количества вызовов между клиентом и базой данных.

В этом руководстве мы рассмотрим оба решения, использующие MongoDB Shell и код драйвера Java.

Давайте углубимся в реализацию массового обновления документов в MongoDB.

2. Инициализация базы данных

Прежде всего, нам нужно подключиться к оболочке mongo:

mongo --host localhost --port 27017

Теперь настройте базу данных foreach и набор образцов :

use foreach;
db.createCollection(populations);

Давайте добавим некоторые выборочные данные в популяции коллекций, используя метод insertMany :

db.populations.insertMany([
{
"cityId":1124,
"cityName":"New York",
"countryName":"United States",
"continentName":"North America",
"population":22
},
{
"cityId":1125,
"cityName":"Mexico City",
"countryName":"Mexico",
"continentName":"North America",
"population":25
},
{
"cityId":1126,
"cityName":"New Delhi",
"countryName":"India",
"continentName":"Asia",
"population":45
},
{
"cityId":1134,
"cityName":"London",
"countryName":"England",
"continentName":"Europe",
"population":32
}]);

Приведенный выше запрос insertMany вернет следующий документ:

{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623575049d55d4e137e477f6"),
ObjectId("623575049d55d4e137e477f7"),
ObjectId("623575049d55d4e137e477f8"),
ObjectId("623575049d55d4e137e477f9")
]
}

Здесь мы вставили четыре документа в приведенный выше запрос для выполнения всех типов операций массовой записи в MongoDB.

База данных foreach была успешно создана, и все необходимые данные также вставлены в популяции коллекций , поэтому мы готовы выполнить массовое обновление.

3. Использование запроса оболочки MongoDB

Конструктор массовых операций MongoDB используется для построения списка массовых операций записи для одной коллекции. Мы можем инициализировать массовые операции двумя разными способами. Метод initializeOrderedBulkOp используется для выполнения массовых операций в упорядоченном списке операций записи. Один из недостатков initializeOrderedBulkOp заключается в том, что если при обработке каких-либо операций записи возникает ошибка, MongoDB вернется без обработки оставшихся операций записи в списке.

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

db.populations.bulkWrite([
{
insertOne :
{
"document" :
{
"cityId":1128,
"cityName":"Kathmandu",
"countryName":"Nepal",
"continentName":"Asia",
"population":12
}
}
},
{
insertOne :
{
"document" :
{
"cityId":1130,
"cityName":"Mumbai",
"countryName":"India",
"continentName":"Asia",
"population":55
}
}
},
{
updateOne :
{
"filter" :
{
"cityName": "New Delhi"
},
"update" :
{
$set :
{
"status" : "High Population"
}
}
}
},
{
updateMany :
{
"filter" :
{
"cityName": "London"
},
"update" :
{
$set :
{
"status" : "Low Population"
}
}
}
},
{
deleteOne :
{
"filter" :
{
"cityName":"Mexico City"
}
}
},
{
replaceOne :
{
"filter" :
{
"cityName":"New York"
},
"replacement" :
{
"cityId":1124,
"cityName":"New York",
"countryName":"United States",
"continentName":"North America",
"population":28
}
}
}
]);

Приведенный выше запрос bulkWrite вернет следующий документ:

{
"acknowledged" : true,
"deletedCount" : 1,
"insertedCount" : 2,
"matchedCount" : 3,
"upsertedCount" : 0,
"insertedIds" :
{
"0" : ObjectId("623575f89d55d4e137e477f9"),
"1" : ObjectId("623575f89d55d4e137e477fa")
},
"upsertedIds" : {}
}

Здесь, в приведенном выше запросе, мы выполнили все типы операций записи, т.е. insertOne , updateOne , deleteOne , replaceOne .

Во- первых, мы использовали метод insertOne для вставки нового документа в коллекцию. Во- вторых, мы использовали updateOne для обновления документа cityName «Нью-Дели». Позже мы использовали метод deleteOne для удаления документа из коллекции на основе фильтра. Наконец, мы использовали replaceOne , чтобы заменить весь документ фильтром cityName «Нью-Йорк».

4. Использование Java-драйвера

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

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

Здесь мы создали соединение с сервером MongoDB, работающим на порту 27017 по умолчанию. Давайте теперь реализуем те же массовые операции, используя код Java:

List<WriteModel<Document>> writeOperations = new ArrayList<WriteModel<Document>>();
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1128)
.append("cityName", "Kathmandu")
.append("countryName", "Nepal")
.append("continentName", "Asia")
.append("population", 12)));
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1130)
.append("cityName", "Mumbai")
.append("countryName", "India")
.append("continentName", "Asia")
.append("population", 55)));
writeOperations.add(new UpdateOneModel<Document>(new Document("cityName", "New Delhi"),
new Document("$set", new Document("status", "High Population"))
));
writeOperations.add(new UpdateManyModel<Document>(new Document("cityName", "London"),
new Document("$set", new Document("status", "Low Population"))
));
writeOperations.add(new DeleteOneModel<Document>(new Document("cityName", "Mexico City")));
writeOperations.add(new ReplaceOneModel<Document>(new Document("cityId", 1124),
new Document("cityName", "New York").append("cityName", "United States")
.append("continentName", "North America")
.append("population", 28)));
BulkWriteResult bulkWriteResult = collection.bulkWrite(writeOperations);
System.out.println("bulkWriteResult:- " + bulkWriteResult);

Здесь мы сначала создали список writeModel , чтобы добавить все различные типы операций записи в один список обновлений. Кроме того, в нашем запросе мы использовали InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel и ReplaceOneModel . Наконец, метод bulkWrite выполнил все операции сразу.

5. Вывод

В этой статье мы научились выполнять массовые операции в MongoDB, используя различные виды операций записи. Мы выполнили вставку, обновление, удаление и замену документов в одном запросе к БД. Кроме того, мы изучили варианты использования initializeOrderedBulkOp в массовом обновлении в MongoDB.

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

Пример всех кейсов можно найти на GitHub .