1. Översikt
$push är en uppdateringsoperatör i MongoDB som lägger till värdet i en array. Däremot $set operatorn används för att uppdatera värdet på ett befintligt fält i dokumentet.
I den här korta handledningen kommer vi att presentera hur du utför $push och $set operationer tillsammans i en enda uppdateringsfråga.
2. Databasinitiering
Innan vi går vidare för att utföra flera uppdateringsoperationer måste vi först ställa in en databas baeldung och provsamlings märken :
use baeldung;
db.createCollection(marks);
Låt oss infoga några dokument i samlingens märken med hjälp av insertMany metod för 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
}
]
}
]);
Vid lyckad infogning kommer ovanstående fråga att returnera följande svar:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Hittills har vi framgångsrikt infogat några exempeldokument i samlingens märken .
3. Förstå problemet
För att förstå problemet, låt oss först förstå dokumentet som vi precis infogade. Den innehåller studentuppgifterna och de betyg de fått i olika ämnen. totalMarks är summan av betyg som erhålls i olika ämnen.
Låt oss överväga en situation där vi vill lägga till ett nytt ämne i subjectDetails array. För att även göra data konsekventa måste vi uppdatera totalMarks fältet också.
I MongoDB lägger vi först till det nya ämnet i arrayen med $push operatör. Sedan ställer vi in totalMarks till ett visst värde med $set operatör.
Båda dessa operationer kan utföras individuellt med $push och $set operatör. Men vi kan skriva MongoDB-frågan för att utföra båda operationerna samtidigt.
4. Använda MongoDB Shell Query
I MongoDB kan vi uppdatera flera fält i ett dokument med de olika uppdateringsoperatörerna. Här kommer vi att använda både $push och $set operatorer tillsammans i en updateOne fråga.
Låt oss kolla in exemplet som innehåller både $push och $set operatörer tillsammans:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Här, i ovanstående fråga, har vi lagt till filterfrågan baserat på student-ID. När vi har fått det filtrerade dokumentet uppdaterar vi totalMarks med $set-operatorn. Utöver det infogar vi den nya ämnesdatan i subjectDetails array med $push operatör.
Som ett resultat kommer ovanstående fråga att returnera följande utdata:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Här är matchedCount innehåller dokumentantalet som matchade filtret, medan modifiedCount innehåller antalet ändrade dokument.
5. Java-drivrutinskod
Hittills har vi diskuterat mongo-skalfrågan för att använda $push och $set operatör tillsammans. Här kommer vi att lära oss att implementera detsamma med hjälp av Java-drivrutinskoden.
Innan vi går vidare, låt oss först ansluta till DB och den nödvändiga samlingen:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Här ansluter vi till MongoDB, som körs på port standardport 27017 på localhost.
Låt oss nu titta på Java-drivrutinskoden:
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 det här kodavsnittet har vi använt updateOne metod, som endast uppdaterar ett enda dokument baserat på det tillämpade filtret studentId 1023. Vi använde sedan Updates.combine att utföra flera operationer i ett enda samtal. Fältet totalMarks kommer att uppdateras till 170, och ett nytt dokument subjectData kommer att skjutas till arrayfältet “subjectDetails” .