1. Общ преглед
В този урок ще ви представим как да вмъкнете документи в масив в MongoDB. Освен това ще видим различни приложения на $push и $addToset оператори за добавяне на стойности в масив.
Първо, ще създадем примерна база данни, колекция и ще вмъкнем фиктивни данни в нея. Освен това ще разгледаме няколко основни примера за актуализиране на документ с помощта на $push оператор. По-късно ще обсъдим и различните случаи на използване на $push и $addtoSet оператори.
Нека се потопим дълбоко в различните методи за вмъкване на документи в масив в MongoDB.
2. Инициализация на база данни
Първо, нека настроим нова база данни baeldung и колекция от проби, поръчки :
use baeldung;
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
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
}
Нека сега проверим документа с customerId 1023. Тук можем да видим, че новият елемент е вмъкнат в края на списъка „items “:
{
"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, за да избутаме документа в масив. Нека сега внедрим заявката за насочена актуализация с помощта на Java кода.
Преди да извършим операцията по актуализиране, нека първо се свържем с поръчките колекция в baeldung база данни:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
Тук, в този случай, ние се свързваме с MongoDB, който работи на порт по подразбиране 27017 на localhost.
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 Document е новият начин за достъп до документа 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 shell на $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 оператор и документът ще бъде насочен към масив „items“ само ако е уникален.
5.2. Драйвер на Java с помощта на addToSet Оператор
$addToSet Операторът предоставя различен тип операция за актуализиране на масив в сравнение с натискащия оператор:
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 “.