1. Übersicht
$push ist ein Aktualisierungsoperator in MongoDB, der den Wert in einem Array hinzufügt. Im Gegensatz dazu ist die $set Der Operator wird verwendet, um den Wert eines vorhandenen Felds im Dokument zu aktualisieren.
In diesem kurzen Tutorial stellen wir vor, wie man $push ausführt und $set Operationen zusammen in einer einzigen Aktualisierungsabfrage.
2. Datenbankinitialisierung
Bevor wir fortfahren, die mehreren Aktualisierungsvorgänge durchzuführen, müssen wir zuerst eine Datenbank baeldung einrichten und Probenahme-Marken :
use baeldung;
db.createCollection(marks);
Lassen Sie uns ein paar Dokumente in die Sammlung marks einfügen mit insertMany Methode der 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
}
]
}
]);
Bei erfolgreicher Einfügung gibt die obige Abfrage die folgende Antwort zurück:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Bisher haben wir erfolgreich einige Musterdokumente in die Sammlung marks eingefügt .
3. Verständnis des Problems
Um das Problem zu verstehen, wollen wir zunächst das Dokument verstehen, das wir gerade eingefügt haben. Es enthält die Schülerdaten und die von ihnen in den verschiedenen Fächern erzielten Noten. Die TotalMarks ist die Summe der Noten, die in verschiedenen Fächern erzielt werden.
Betrachten wir eine Situation, in der wir ein neues Thema in den subjectDetails hinzufügen möchten Reihe. Um die Daten auch konsistent zu machen, müssen wir die totalMarks aktualisieren Feld.
In MongoDB fügen wir zuerst das neue Thema mithilfe von $push zum Array hinzu Operator. Dann setzen wir die totalMarks mit $set auf einen bestimmten Wert Betreiber.
Diese beiden Operationen können einzeln mit $push ausgeführt werden und $set Betreiber bzw. Aber wir können die MongoDB-Abfrage schreiben, um beide Operationen zusammen auszuführen.
4. Verwenden der MongoDB-Shell-Abfrage
In MongoDB können wir mehrere Felder eines Dokuments mit den verschiedenen Aktualisierungsoperatoren aktualisieren. Hier verwenden wir beide $push und $set Operatoren zusammen in einem updateOne Abfrage.
Schauen wir uns das Beispiel an, das beide $push enthält und $set Operatoren zusammen:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Hier haben wir in der obigen Abfrage die Filterabfrage basierend auf der studentId hinzugefügt. Sobald wir das gefilterte Dokument erhalten, aktualisieren wir die totalMarks mit dem $set-Operator. Außerdem fügen wir die neuen Probandendaten in die subjectDetails ein Array mit dem $push Betreiber.
Als Ergebnis gibt die obige Abfrage die folgende Ausgabe zurück:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Hier der matchedCount enthält die Anzahl der Dokumente, die mit dem Filter übereinstimmten, während modifiedCount enthält die Anzahl der geänderten Dokumente.
5. Java-Treibercode
Bisher haben wir die Mongo-Shell-Abfrage zur Verwendung von $push besprochen und $set Betreiber zusammen. Hier lernen wir, dasselbe mit dem Java-Treibercode zu implementieren.
Bevor wir fortfahren, verbinden wir uns zuerst mit der DB und der erforderlichen Sammlung:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Hier stellen wir eine Verbindung zu MongoDB her, die auf dem Standardport 27017 auf localhost ausgeführt wird.
Sehen wir uns nun den Java-Treibercode an:
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)));
In diesem Codeausschnitt haben wir updateOne verwendet -Methode, die nur ein einzelnes Dokument basierend auf dem angewendeten Filter studentId aktualisiert 1023. Wir haben dann die Updates.combine verwendet um mehrere Operationen in einem einzigen Aufruf auszuführen. Das Feld totalMarks wird auf 170 aktualisiert, und ein neues Dokument subjectData wird in das Array-Feld „subjectDetails“ verschoben .