1. Общ преглед
MongoDB е документно-ориентирана NoSQL база данни, която е публично достъпна. Можем да актуализираме документите в колекция, използвайки различни методи като актуализация , заменете и запазете . За да променим конкретно поле на документа, ще използваме различни оператори като $set , $inc, и др.
В този урок ще се научим да променяме множеството полета на документ с помощта на актуализация и заменете запитване. За демонстрационни цели първо ще обсъдим заявката за mongo shell и след това съответната й реализация в Java.
Нека сега разгледаме различните методи за постигане на целта.
2. Shell заявка за актуализиране на различни полета
Преди да започнем, нека първо създадем нова база данни, baeldung , и колекция от проби, служител . Ще използваме тази колекция във всички примери:
use baeldung;
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 и име_на_служител полето се използва за филтриране на документа и $set операторът се използва за актуализиране на заданието и 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. MongoDB Java драйвер поддържа два класа за представяне на MongoDB документ, com.mongodb.BasicDBObject и org.bson.Document. Ще разгледаме и двата метода за актуализиране на полета в документ.
Преди да продължим, нека първо се свържем със служителя колекция в baeldung DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
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 и работа според зададената заявка.
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 метод. екв. филтърът съответства на employee_id с точно съвпадащия текст „794875“. След това актуализираме department_id и работата като използвате набора оператор.
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 метод.