1. Oversigt
$push er en opdateringsoperatør i MongoDB, der tilføjer værdien i et array. I modsætning hertil er $set operator bruges til at opdatere værdien af et eksisterende felt i dokumentet.
I denne korte vejledning introducerer vi, hvordan du udfører $push og $set operationer sammen i en enkelt opdateringsforespørgsel.
2. Databaseinitialisering
Før vi går videre for at udføre de flere opdateringsoperationer, skal vi først opsætte en database baeldung og prøvesamlings mærker :
use baeldung;
db.createCollection(marks);
Lad os indsætte et par dokumenter i samlingens mærker ved at bruge insertMany metode for 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
}
]
}
]);
Ved vellykket indsættelse vil ovenstående forespørgsel returnere følgende svar:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Indtil videre har vi med succes indsat et par eksempeldokumenter i samlingens mærker .
3. Forstå problemet
For at forstå problemet, lad os først forstå det dokument, vi lige har indsat. Det inkluderer elevoplysningerne og de karakterer, de har opnået i forskellige fag. totalMarks er summen af karakterer, der opnås i forskellige fag.
Lad os overveje en situation, hvor vi ønsker at tilføje et nyt emne i emnedetaljer array. For også at gøre dataene konsistente skal vi opdatere totalMarks felt også.
I MongoDB tilføjer vi først det nye emne til arrayet ved hjælp af $push operatør. Derefter sætter vi totalMarks felt til en bestemt værdi ved hjælp af $set operatør.
Begge disse operationer kan udføres individuelt ved hjælp af $push og $set henholdsvis operatør. Men vi kan skrive MongoDB-forespørgslen for at udføre begge operationer sammen.
4. Brug af MongoDB Shell Query
I MongoDB kan vi opdatere flere felter i et dokument ved hjælp af de forskellige opdateringsoperatører. Her vil vi bruge både $push og $set operatører sammen i en updateOne forespørgsel.
Lad os tjekke eksemplet, der indeholder både $push og $set operatører sammen:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Her, i ovenstående forespørgsel, har vi tilføjet filterforespørgslen baseret på studentId. Når vi har fået det filtrerede dokument, opdaterer vi totalMarks ved at bruge $set-operatoren. Derudover indsætter vi de nye emnedata i emnedetaljer array ved hjælp af $push operatør.
Som et resultat vil ovenstående forespørgsel returnere følgende output:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Her er matchedCount indeholder det dokumentantal, der matchede filteret, mens modifiedCount indeholder antallet af ændrede dokumenter.
5. Java-driverkode
Indtil videre har vi diskuteret mongo shell-forespørgslen om at bruge $push og $set operatør sammen. Her lærer vi at implementere det samme ved hjælp af Java-driverkoden.
Før vi går videre, lad os først oprette forbindelse til DB'en og den nødvendige samling:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Her opretter vi forbindelse til MongoDB, som kører på port standard port 27017 på localhost.
Lad os nu se på Java-driverkoden:
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)));
I dette kodestykke har vi brugt updateOne metode, som kun opdaterer et enkelt dokument baseret på det anvendte filter studentId 1023. Vi brugte derefter Updates.combine at udføre flere handlinger i et enkelt opkald. Feltet totalMarks vil blive opdateret til 170, og et nyt dokument subjectData vil blive skubbet til array-feltet “subjectDetails” .