1. Общ преглед
Upsert е комбинация от вмъкване и актуализиране (inSERT + UPdate =upsert). Можем да използваме upsert с различни методи за актуализиране, т.е. актуализация , findAndModify и заменете едно .
Тук, в MongoDB, upsert опцията е булева стойност. Да предположим, че стойността е true и документите съответстват на посочения филтър за заявка. В този случай приложената операция за актуализиране ще актуализира документите. Ако стойността е true и няма документи, отговарящи на условието, тази опция вмъква нов документ в колекцията. Новият документ ще съдържа полетата, базирани на филтърни и приложени операции.
В този урок първо ще разгледаме upsert в заявка на MongoDB Shell и след това използвайте кода на драйвера на Java.
2. Инициализация на база данни
Преди да продължим напред, за да извършим пренасочването операции, първо трябва да настроим нова база данни baeldung и колекция от проби превозно средство :
db.vehicle.insertMany([
{
"companyName":"Nissan",
"modelName":"GTR",
"launchYear":2016,
"type":"Sports",
"registeredNo":"EPS 5561"
},
{
"companyName":"BMW",
"modelName":"X5",
"launchYear":2020,
"type":"SUV",
"registeredNo":"LLS 6899"
},
{
"companyName":"Honda",
"modelName":"Gold Wing",
"launchYear":2018,
"type":"Bike",
"registeredNo":"LKS 2477"
}]);
В случай на успешно вмъкване, горната команда ще отпечата JSON, подобен на показания по-долу:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623c1db39d55d4e137e4781b"),
ObjectId("623c1db39d55d4e137e4781c"),
ObjectId("623c1db39d55d4e137e4781d")
]
}
Успешно добавихме фиктивните данни в превозното средство за събиране .
3. Използване на актуализация Метод
В този раздел ще се научим да използваме upsert опция с актуализация метод. Основната цел на upsert опцията е да актуализирате съществуващия документ въз основа на приложения филтър или да вмъкнете нов документ, ако филтърът не отговаря на съвпадението .
Като илюстрация ще използваме $setOnInsert оператор с upsert опция за получаване на допълнително предимство при вмъкване на нови полета в документа.
Нека да проверим заявка, в която условието на филтъра съответства на съществуващия документ от колекцията:
db.vehicle.update(
{
"modelName":"X5"
},
{
"$set":{
"companyName":"Hero Honda"
}
},
{
"upsert":true
});
Горната заявка ще върне следния документ:
{
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1
}
Тук ще видим кода на драйвера на Java, съответстващ на горната заявка за mongo shell:
UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult updateResult = collection.updateOne(Filters.eq("modelName", "X5"),
Updates.combine(Updates.set("companyName", "Hero Honda")), options);
System.out.println("updateResult:- " + updateResult);
В горната заявка полето име на модел „X5“ вече съществува в колекцията, така че полето companyName от този документ ще бъде актуализиран до „Hero Honda“.
Сега нека разгледаме пример за upsert опция с помощта на $setOnInsert оператор. Ще бъде приложимо само в случай на добавяне на нов документ:
db.vehicle.update(
{
"modelName":"GTPR"
},
{
"$set":{
"companyName":"Hero Honda"
},
"$setOnInsert":{
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
},
{
"upsert":true
});
Горната заявка ще върне следния документ:
{
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("623b378ed648af670fe50e7f")
}
Кодът на драйвера на Java на горната заявка за актуализиране с $setOnInsert опцията ще бъде:
UpdateResult updateSetOnInsertResult = collection.updateOne(Filters.eq("modelName", "GTPR"),
Updates.combine(Updates.set("companyName", "Hero Honda"),
Updates.setOnInsert("launchYear", 2022),
Updates.setOnInsert("type", "Bike"),
Updates.setOnInsert("registeredNo", "EPS 5562")), options);
System.out.println("updateSetOnInsertResult:- " + updateSetOnInsertResult);
Тук, в горната заявка, условието за филтриране на полето modelName „GTPR“ не съответства на нито един документ за колекция, така че ще добавим нов документ към колекцията. Ключовият момент, който трябва да се отбележи, е, че $setOnInsert добавя всички полета в новия документ.
4. Използване на findAndModify Метод
Можем също да използваме upsert опция с помощта на findAndModify метод. За този метод стойността по подразбиране на upsert опцията е false . Ако зададем upsert опция за true , той ще работи точно по същия начин като метода за актуализиране.
Нека да разгледаме случай на използване на findAndModify метод с upsert опция true :
db.vehicle.findAndModify(
{
query:{
"modelName":"X7"
},
update: {
"$set":{
"companyName":"Hero Honda"
}
},
"upsert":true,
"new":true
});
В този случай горната заявка ще върне новосъздадения документ. Нека да проверим кода на драйвера на Java на горната заявка:
FindOneAndUpdateOptions upsertOptions = new FindOneAndUpdateOptions();
upsertOptions.returnDocument(ReturnDocument.AFTER);
upsertOptions.upsert(true);
Document resultDocument = collection.findOneAndUpdate(Filters.eq("modelName", "X7"),
Updates.set("companyName", "Hero Honda"), upsertOptions);
System.out.println("resultDocument:- " + resultDocument);
Тук първо създадохме условието за филтриране и въз основа на това или ще актуализираме съществуващия документ, или ще добавим нов документ към колекцията превозно средство .
5. Използване на replaceOne Метод
Нека да извършим поднасяне операция с помощта на replaceOne метод. replaceOne методът на MongoDB просто замества единичния документ в колекцията, ако условието съвпада.
Първо, нека разгледаме заявката на обвивката на Mongo на метода replace:
db.vehicle.replaceOne(
{
"modelName":"GTPR"
},
{
"modelName" : "GTPR",
"companyName" : "Hero Honda",
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
{
"upsert":true
});
Горната заявка ще върне следния отговор:
{
"acknowledged" : true,
"matchedCount" : 1,
"modifiedCount" : 1
}
Сега нека напишем горната заявка, използвайки кода на драйвера на Java:
Document replaceDocument = new Document();
replaceDocument.append("modelName", "GTPP")
.append("companyName", "Hero Honda")
.append("launchYear", 2022)
.append("type", "Bike")
.append("registeredNo", "EPS 5562");
UpdateResult updateReplaceResult = collection.replaceOne(Filters.eq("modelName", "GTPP"), replaceDocument, options);
System.out.println("updateReplaceResult:- " + updateReplaceResult);
Тук, в този случай, първо трябва да създадем нов документ, с който искаме да заменим съществуващия документ, и с upsert опция true , ще заменим документа само ако условието отговаря.