sql >> Database teknologi >  >> NoSQL >> MongoDB

Push og sæt operationer i samme MongoDB-opdatering

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


  1. Konkurrerende forbruger på Redis Pub/Sub understøttet?

  2. Arbejder du med indlejrede objekter i Redis?

  3. Unik scoring for Redis leaderboard

  4. brew install mongodb fejl:Fej at nægte at `sudo brew install' Mac OSX Lion