1. Přehled
Upsert je kombinace vložení a aktualizace (inSERT + UPdate =upsert). Můžeme použít upsert s různými metodami aktualizace, tj. aktualizací , findAndModify a replaceOne .
Zde v MongoDB, upsert možnost je Boolean hodnota. Předpokládejme, že hodnota je true a dokumenty odpovídají zadanému filtru dotazu. V takovém případě provede operace aktualizace dokumenty. Pokud je hodnota true a podmínce neodpovídají žádné dokumenty, tato volba vloží do sbírky nový dokument. Nový dokument bude obsahovat pole založená na filtru a použitých operacích.
V tomto tutoriálu se nejprve podíváme na upsert v dotazu MongoDB Shell a poté použijte kód ovladače Java.
2. Inicializace databáze
Než přejdeme k provedení upsert operace, nejprve musíme nastavit novou databázi baeldung a ukázkovou kolekci, vozidlo :
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"
}]);
V případě úspěšného vložení vypíše výše uvedený příkaz JSON podobný tomu, který je zobrazen níže:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623c1db39d55d4e137e4781b"),
ObjectId("623c1db39d55d4e137e4781c"),
ObjectId("623c1db39d55d4e137e4781d")
]
}
Úspěšně jsme přidali figuríny do kolekce vozidla .
3. Pomocí aktualizace Metoda
V této části se naučíme používat upsert možnost s aktualizací metoda. Hlavní účel upsert možnost je aktualizovat stávající dokument na základě použitého filtru nebo vložit nový dokument, pokud filtr nezíská shodu .
Jako příklad použijeme $setOnInsert operátor s upsert možnost získat další výhodu při vkládání nových polí do dokumentu.
Pojďme se podívat na dotaz, ve kterém podmínka filtru odpovídá existujícímu dokumentu kolekce:
db.vehicle.update(
{
"modelName":"X5"
},
{
"$set":{
"companyName":"Hero Honda"
}
},
{
"upsert":true
});
Výše uvedený dotaz vrátí následující dokument:
{
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1
}
Zde uvidíme kód ovladače Java odpovídající výše uvedenému dotazu 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);
Ve výše uvedeném dotazu pole modelName „X5“ již v kolekci existuje, takže pole companyName tohoto dokumentu bude aktualizován na „Hero Honda“.
Nyní se podívejme na příklad upsert pomocí možnosti $setOnInsert operátor. Bude použitelné pouze v případě přidání nového dokumentu:
db.vehicle.update(
{
"modelName":"GTPR"
},
{
"$set":{
"companyName":"Hero Honda"
},
"$setOnInsert":{
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
},
{
"upsert":true
});
Výše uvedený dotaz vrátí následující dokument:
{
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("623b378ed648af670fe50e7f")
}
Kód ovladače Java z výše uvedeného aktualizačního dotazu s $setOnInsert možnost bude:
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);
Zde, ve výše uvedeném dotazu, podmínka filtru pole modelName „GTPR“ neodpovídá žádnému sbírkovému dokumentu, proto do sbírky přidáme nový dokument. Klíčovým bodem, který je třeba poznamenat, je $setOnInsert přidá všechna pole do nového dokumentu.
4. Pomocí findAndModify Metoda
Můžeme také použít upsert pomocí možnosti findAndModify metoda. U této metody je výchozí hodnotou upsert možnost je false . Pokud nastavíme upsert možnost pravda , bude fungovat přesně stejně jako metoda aktualizace.
Pojďme se podívat na případ použití findAndModify metodou upsert možnost pravda :
db.vehicle.findAndModify(
{
query:{
"modelName":"X7"
},
update: {
"$set":{
"companyName":"Hero Honda"
}
},
"upsert":true,
"new":true
});
V tomto případě výše uvedený dotaz vrátí nově vytvořený dokument. Pojďme se podívat na kód ovladače Java ve výše uvedeném dotazu:
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);
Zde jsme nejprve vytvořili podmínku filtru a na základě toho buď aktualizujeme stávající dokument, nebo přidáme nový dokument do kolekce vozidlo .
5. Pomocí replaceOne Metoda
Proveďme upsert operace pomocí replaceOne metoda. replaceOne metoda MongoDB pouze nahradí jeden dokument v kolekci, pokud podmínka odpovídá.
Nejprve se podívejme na dotaz prostředí Mongo metody nahrazení:
db.vehicle.replaceOne(
{
"modelName":"GTPR"
},
{
"modelName" : "GTPR",
"companyName" : "Hero Honda",
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
{
"upsert":true
});
Výše uvedený dotaz vrátí následující odpověď:
{
"acknowledged" : true,
"matchedCount" : 1,
"modifiedCount" : 1
}
Nyní napišme výše uvedený dotaz pomocí kódu ovladače 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);
Zde v tomto případě musíme nejprve vytvořit nový dokument, kterým chceme stávající dokument nahradit, a s upsert možnost pravda , dokument nahradíme pouze v případě, že bude splněna podmínka.