1. Přehled
MongoDB je multiplatformní, dokumentově orientovaná, open source databáze NoSQL napsaná v C++. MongoDB navíc poskytuje vysoký výkon, vysokou dostupnost a automatické škálování.
K aktualizaci dokumentů v MongoDB můžeme použít různé metody jako updateOne , findOneAndUpdate, atd. Dále MongoDB poskytuje různé operátory pro metody aktualizace.
V tomto tutoriálu probereme různé přístupy k provádění operací aktualizace v MongoDB. U každého přístupu nejprve probereme dotaz mongo shell a poté jeho implementaci v Javě.
2. Nastavení databáze
Než přejdeme k aktualizačním dotazům, nejprve vytvořte databázi baeldung a ukázková sbírka student:
use baeldung;
db.createCollection(student);
Pro ilustraci přidáme několik dokumentů do sbírky student pomocí insertMany dotaz:
db.student.insertMany([
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 1",
"age": 16,
"roll_no":199406
},
{
"student_id": 8765,
"student_name": "Andrew Boult",
"address": "Hostel 2",
"age": 18,
"roll_no":199408
}
]);
Po úspěšném vložení získáme JSON s acknowledged:true :
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("621b078485e943405d04b557"),
ObjectId("621b078485e943405d04b558")
]
}
Pojďme se nyní ponořit hluboko do různých způsobů aktualizace dokumentů v MongoDB.
3. Pomocí updateOne Metoda
Operaci aktualizace v MongoDB lze provést přidáním nového pole, odebráním pole nebo aktualizací existujícího pole. The updateOne metoda aktualizuje jeden dokument v kolekci na základě použitého filtru dotazu. Nejprve najde dokument, který odpovídá filtru, a poté aktualizuje zadaná pole.
Kromě toho můžeme použít různé operátory, například $set , $unset , $inc , atd., pomocí metody aktualizace.
Abychom to demonstrovali, podívejme se na dotaz na aktualizaci jednoho dokumentu kolekce:
db.student.updateOne(
{
"student_name" : "Paul Starc"
},
{
$set: {
"address" : "Hostel 2"
}
}
);
Získáme výstup podobný tomu, který je zobrazen níže:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Pojďme se nyní podívat na kód Java ovladače výše uvedeného updateOne dotaz:
UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));
Zde jsme nejprve použili jméno_studenta pole pro filtrování dokumentů. Poté aktualizujeme adresu dokumentu pomocí jméno_studenta "Paul Starc".
4. Pomocí updateMany Metoda
updateMany metoda aktualizuje všechny dokumenty v kolekcích MongoDB, které odpovídají danému filtru. Jedna z výhod používání updateMany je, že můžeme aktualizovat více dokumentů, aniž bychom ztratili pole starých dokumentů.
Podívejme se na dotaz shellu MongoDB pomocí updateMany metoda:
db.student.updateMany(
{
age: {
$lt: 20
}
},
{
$set:{
"Review" : true
}
}
);
Výše uvedený příkaz vrátí následující výstup:
{
"acknowledged":true,
"matchedCount":2,
"modifiedCount":2
}
Zde matchedCount obsahuje počet odpovídajících dokumentů, zatímco modifiedCount obsahuje číslo upraveného dokumentu.
Nyní se podíváme na kód ovladače Java pomocí updateMany metoda:
UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));
Zde jsou všechny dokumenty s stáří bude filtrováno méně než 20 a Recenze pole bude nastaveno na true .
5. Pomocí replaceOne Metoda
replaceOne metoda MongoDB nahradí celý dokument. Jedna z nevýhod replaceOne je, že všechna starší pole budou nahrazena novými poli a starší pole budou také ztracena:
db.student.replaceOne(
{
"student_id": 8764
},
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
}
);
V tomto případě dostaneme následující výstup:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Pokud nejsou nalezeny žádné shody, operace vrátí matchedCount jako 0:
{
"acknowledged":true,
"matchedCount":0,
"modifiedCount":0
}
Pojďme napsat odpovídající kód ovladače Java pomocí replaceOne metoda:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age",18)
.append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);
Ve výše uvedeném kódu jsme vytvořili dokument, kterým bude starší dokument nahrazen. Dokument s id_studenta 8764 bude nahrazeno nově vytvořeným dokumentem.
6. Pomocí findOneAndReplace Metoda
findOneAndReplace metoda je jednou z pokročilých metod aktualizace poskytovaných MongoDB a nahrazuje první odpovídající dokument na základě daných kritérií výběru. Ve výchozím nastavení tato metoda vrací původní dokument. Můžeme použít různé možnosti findOneAndReplace v případě potřeby dokumenty třídit a projektovat.
Stručně řečeno, findOneAndReplace nahradí první odpovídající dokument kolekce na základě použitého filtru:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
returnNewDocument: false
}
);
Tento dotaz vrátí následující dokument:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 1",
"age":16,
"roll_no":199406
}
Pokud nastavíme returnNewDocument na pravdu , operace by pak místo toho vrátila nahrazený dokument:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 2",
"age":18,
"roll_no":199406
}
Nyní použijeme findOneAndReplace metoda k promítnutí id_studenta a věk pole ve vráceném dokumentu:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
projection: {
"_id" : 0,
"student_id":1,
"age" : 1
}
}
);
Výstup výše uvedeného dotazu bude obsahovat pouze projektovaná pole:
{
"student_id":"8764",
"age":16
}
Kód ovladače Java z výše uvedeného dotazu s různými možnostmi findOneAndReplace:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age", 18)
.append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
Filters.eq("student_id", 8764),
replaceDocument,
new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));
Ve výše uvedeném dotazu findOneAndReplace metoda nejprve seřadí dokumenty ve vzestupném pořadí na základě roll_no, a nově vytvořený dokument nahradí dokument id_studenta „8764“.
7. Pomocí findOneAndUpdate Metoda
findOneAndUpdate metoda aktualizuje první odpovídající dokument v kolekci. Pokud kritériím výběru odpovídá více než jeden dokument, aktualizuje se pouze první odpovídající dokument. Když dokument aktualizujeme, hodnota _id pole zůstane nezměněno:
db.student.findOneAndUpdate(
{
"student_id" : 8764
},
{
$inc : {
"roll_no" : 5
}
},
{
sort: {
"roll_no" : 1
},
projection: {
"_id" : 0,
"student_id":1,
"address" : 1
}
}
);
Výstup dotazu bude obsahovat pouze studentId a adresa staršího dokumentu:
{
"student_id":8764,
"address":"Hostel 1"
}
Kód ovladače Java z výše uvedeného dotazu pomocí různých možností findOneAndUpdate je následující:
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
Filters.eq("student_id", 8764),
Updates.inc("roll_no", 5),
new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));
V tomto případě findOneAndUpdate metoda nejprve seřadí dokument ve vzestupném pořadí na základě roll_no . Výše uvedený dotaz zvyšuje hodnotu roll_no o 5 a poté vrátí id_studenta a adresa pole.