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

Push-операции в MongoDB

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

1. Обзор

В этом руководстве мы расскажем, как вставлять документы в массив в MongoDB . Кроме того, мы увидим различные применения операторов $push и $addToset для добавления значений в массив.

Сначала мы создадим образец базы данных, коллекцию и вставим в нее фиктивные данные. Далее мы рассмотрим несколько основных примеров обновления документа с помощью оператора $push . Позже мы также обсудим различные варианты использования операторов $push и $addtoSet .

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

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

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

use foreach;
db.createCollection(orders);

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

db.orders.insertMany([
{
"customerId": 1023,
"orderTimestamp": NumberLong("1646460073000"),
"shippingDestination": "336, Street No.1 Pawai Mumbai",
"purchaseOrder": 1000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "VEG PIZZA",
"quantity": 1,
"price": 800
}
]
},
{
"customerId": 1027,
"orderTimestamp": NumberLong("1646460087000"),
"shippingDestination": "445, Street No.2 Pawai Mumbai",
"purchaseOrder": 2000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "NON-VEG PIZZA",
"quantity": 1,
"price": 1200
}
]
}
]);

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

{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}

На данный момент мы успешно настроили базу данных и коллекцию. Мы будем использовать эту базу данных и коллекцию для всех примеров.

3. Push-операция с использованием Mongo Query

MongoDB предоставляет различные типы операторов массивов для обновления массивов в документах MongoDB. Оператор $push в MongoDB добавляет значение в конец массива. В зависимости от типа запроса мы можем использовать оператор $push с такими методами, как updateOne , updateMany , findAndModify и т. д.

Давайте теперь рассмотрим запрос оболочки с помощью оператора $push :

db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});

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

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

Давайте теперь проверим документ с идентификатором клиента 1023. Здесь мы видим, что новый элемент вставлен в конец списка « элементы »:

{
"customerId" : 1023,
"orderTimestamp" : NumberLong("1646460073000"),
"shippingDestination" : "336, Street No.1 Pawai Mumbai",
"purchaseOrder" : 1000,
"contactNumber" : "9898987676",
"items" : [
{
"itemName" : "BERGER",
"quantity" : 1,
"price" : 500
},
{
"itemName" : "VEG PIZZA",
"quantity" : 1,
"price" : 800
},
{
"itemName" : "PIZZA MANIA",
"quantity" : 1,
"price" : 800
}
]
}

4. Операция push с использованием кода драйвера Java

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

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

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

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

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

Драйвер MongoDB Java обеспечивает поддержку документов DBObject и BSON . Здесь объект DBObject является частью устаревшего драйвера MongoDB, но в более новой версии MongoDB он не рекомендуется.

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

DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
.append("quantity", 1)
.append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);

В приведенном выше запросе мы сначала создали документ элемента, используя BasicDBObject . На основе searchQuery документы коллекции будут отфильтрованы, а значения будут помещены в массив.

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

Документ BSON — это новый способ доступа к документу MongoDB на Java, созданный с использованием более нового клиентского стека. Класс org.bson.Document менее сложен и удобен в использовании.

Давайте воспользуемся классом org.bson.Document для помещения значений в массив « items» :

Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));

В этом случае реализация BSON аналогична коду, запускаемому с использованием DBObject, и обновление также будет таким же. Здесь мы использовали метод updateOne для обновления только одного документа.

5. Использование оператора addToSet

Оператор $addToSet также можно использовать для добавления значения в массив. Этот оператор добавляет значения, только если это значение не существует в массиве. В противном случае он просто проигнорирует его. В то время как оператор push вставит значение в качестве условия для фильтрации, чтобы получить совпадение.

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

5.1. Запрос оболочки с использованием оператора addToSet

Запрос оболочки mongo оператора $addToSet аналогичен оператору $push , но $addToSet не вставляет повторяющееся значение в массив.

Давайте теперь проверим запрос MongoDB, чтобы поместить значения в массив с помощью $addToset :

db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});

В этом случае вывод будет следующим:

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

В этом случае мы использовали оператор $addToSet , и документ будет помещен в массив «элементов», только если он уникален.

5.2. Драйвер Java с использованием оператора addToSet

Оператор $ addToSet обеспечивает другой тип операции обновления массива по сравнению с оператором push:

Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
.updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);

В приведенном выше коде сначала мы создали документ « item », а на основе фильтра customerId метод updateOne попытается протолкнуть документ « item » в массив « items ».

6. Заключение

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

Реализацию всех кейсов можно найти на GitHub .