1. Přehled
$push je aktualizační operátor v MongoDB, který přidává hodnotu do pole. Naproti tomu $set operátor se používá k aktualizaci hodnoty existujícího pole v dokumentu.
V tomto krátkém tutoriálu vám představíme, jak provést $push a $set operace společně v jediném aktualizačním dotazu.
2. Inicializace databáze
Než se pustíme do provádění několika aktualizačních operací, musíme nejprve nastavit databázi baeldung a značky kolekce vzorků :
use baeldung;
db.createCollection(marks);
Vložme do sbírky značky pár dokumentů pomocí insertMany metoda MongoDB:
db.marks.insertMany([
{
"studentId": 1023,
"studentName":"James Broad",
"joiningYear":"2018",
"totalMarks":100,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":40
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
},
{
"studentId": 1024,
"studentName":"Chris Overton",
"joiningYear":"2018",
"totalMarks":110,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":50
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
}
]);
Po úspěšném vložení vrátí výše uvedený dotaz následující odpověď:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Do sbírky značek jsme zatím úspěšně vložili pár vzorových dokumentů .
3. Pochopení problému
Abychom porozuměli problému, pojďme nejprve porozumět dokumentu, který jsme právě vložili. Zahrnuje podrobnosti o studentech a známky, které získali v různých předmětech. totalMarks je součet známek získaných v různých předmětech.
Uvažujme situaci, kdy si přejeme přidat nový předmět do podrobnosti předmětu pole. Aby byla data konzistentní, musíme aktualizovat totalMarks pole také.
V MongoDB nejprve přidáme nový předmět do pole pomocí $push operátor. Poté nastavíme totalMarks pole na konkrétní hodnotu pomocí $set operátor.
Obě tyto operace lze provést jednotlivě pomocí $push a $set provozovatel, resp. Ale můžeme napsat dotaz MongoDB, abychom provedli obě operace společně.
4. Použití MongoDB Shell Query
V MongoDB můžeme aktualizovat více polí dokumentu pomocí různých aktualizačních operátorů. Zde použijeme obě $push a $set operátory společně v updateOne dotaz.
Podívejme se na příklad obsahující obojí $push a $set operátory společně:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Zde jsme do výše uvedeného dotazu přidali filtrovací dotaz založený na studentId. Jakmile získáme filtrovaný dokument, aktualizujeme totalMarks pomocí operátoru $set. Kromě toho vkládáme nová data subjektu do subjectDetails pole pomocí $push operátor.
Výsledkem je, že výše uvedený dotaz vrátí následující výstup:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Zde je matchedCount obsahuje počet dokumentů, které odpovídaly filtru, zatímco modifiedCount obsahuje počet upravených dokumentů.
5. Kód ovladače Java
Doposud jsme diskutovali o dotazu mongo shell pro použití $push a $set operátor společně. Zde se naučíme implementovat totéž pomocí kódu ovladače Java.
Než pokročíme vpřed, pojďme se nejprve připojit k DB a požadované kolekci:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Zde se připojujeme k MongoDB, který běží na výchozím portu 27017 na localhost.
Nyní se podíváme na kód ovladače Java:
Document subjectData = new Document()
.append("subjectId", 126)
.append("subjectName", "Java Programming")
.append("marks", 70);
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023),
Updates.combine(Updates.set("totalMarks", 170),
Updates.push("subjectDetails", subjectData)));
V tomto fragmentu kódu jsme použili updateOne metoda, která aktualizuje pouze jeden dokument na základě použitého filtru studentId 1023. Poté jsme použili Updates.combine provádět více operací v jednom hovoru. Pole totalMarks bude aktualizován na 170 a nový dokument subjectData bude přesunuto do pole pole “subjectDetails“ .