sql >> Databasteknik >  >> NoSQL >> MongoDB

Push och ställ in operationer i samma MongoDB-uppdatering

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” .


  1. Inget svar efter anslutning från selleri till redis via ssl

  2. Exkludera specifika fält i jokerteckenindex i MongoDB

  3. Couchbase benchmark avslöjar mycket långsamma INSERTs och GETs (med hjälp av KeyValue-operationer); långsammare än kvarvarande MySQL-data

  4. Hur man byter ut sträng i alla dokument i Mongo