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

Opdater dokumenter i MongoDB

1. Oversigt

MongoDB er en dokumentorienteret, open source NoSQL-database på tværs af platforme, skrevet i C++. Derudover giver MongoDB høj ydeevne, høj tilgængelighed og automatisk skalering.

For at opdatere dokumenterne i MongoDB kan vi bruge forskellige metoder såsom updateOne , findOneAndUpdate, osv. Desuden leverer MongoDB forskellige operatører til opdateringsmetoderne.

I denne tutorial vil vi diskutere forskellige tilgange til at udføre opdateringsoperationer i MongoDB. For hver tilgang vil vi først diskutere mongo-shell-forespørgslen og derefter dens implementering i Java.

2. Databaseopsætning

Før vi går videre til opdateringsforespørgslerne, lad os først oprette en database, baeldung , og en prøvesamling, elev:

use baeldung;
db.createCollection(student);

Som en illustration, lad os tilføje et par dokumenter til samlingen elev ved at bruge insertMany forespørgsel:

db.student.insertMany([
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 1",
        "age": 16,
        "roll_no":199406
    },
    {
        "student_id": 8765,
        "student_name": "Andrew Boult",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199408
    }
]);

Ved vellykket indsættelse får vi en JSON med acknowledged:true :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("621b078485e943405d04b557"),
	ObjectId("621b078485e943405d04b558")
    ]
}

Lad os nu dykke dybt ned i forskellige måder at opdatere dokumenterne i MongoDB på.

3. Brug af updateOne Metode

En opdateringshandling i MongoDB kan udføres ved at tilføje et nyt felt, fjerne et felt eller opdatere et eksisterende felt. updateOne  metode opdaterer et enkelt dokument i en samling baseret på det anvendte forespørgselsfilter. Den finder først det dokument, der matcher filteret, og opdaterer derefter de angivne felter.

Derudover kan vi bruge forskellige operatorer såsom $set , $unset , $inc osv., med opdateringsmetoden.

For at demonstrere, lad os se på forespørgslen for at opdatere et enkelt dokument i en samling:

db.student.updateOne(
    { 
        "student_name" : "Paul Starc"
    },
    { 
        $set: {
            "address" : "Hostel 2"
        }
    }
 );

Vi får et output svarende til det vist nedenfor:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Lad os nu tjekke Java-driverkoden for ovenstående updateOne forespørgsel:

UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));

Her har vi for det første brugt student_name felt for at filtrere dokumenterne. Derefter opdaterer vi adressen på dokumentet med student_name "Paul Starc".

4. Brug af updateMany Metode

updateMany metode opdaterer alle dokumenter i MongoDB-samlinger, der matcher det givne filter. En af fordelene ved at bruge updateMany er, at vi kan opdatere flere dokumenter uden at miste felterne i gamle dokumenter.

Lad os se MongoDB shell-forespørgslen ved hjælp af updateMany metode:

db.student.updateMany(
    { 
        age: { 
            $lt: 20
         } 
    },
    { 
        $set:{ 
            "Review" : true 
        }
    }
);

Ovenstående kommando returnerer følgende output:

{
    "acknowledged":true,
    "matchedCount":2,
    "modifiedCount":2
}

Her, matchedCount indeholder antallet af matchede dokumenter, hvorimod modifiedCount indeholder det ændrede dokumentnummer.

Lad os nu se på Java-driverkoden ved hjælp af updateMany metode:

UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

Her er alle dokumenter med alder mindre end 20 vil blive filtreret, og anmeldelsen feltet indstilles til sand .

5. Brug af replaceOne Metode

replaceOne metoden for MongoDB erstatter hele dokumentet. En af ulemperne ved replaceOne er, at alle de ældre felter vil blive erstattet af de nye felter, og de ældre felter vil også gå tabt:

db.student.replaceOne(
    { 
        "student_id": 8764
    },
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406
    }
);

I dette tilfælde får vi følgende output:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Hvis der ikke findes nogen match, returnerer operationen matchedCount som 0:

{
    "acknowledged":true,
    "matchedCount":0,
    "modifiedCount":0
}

Lad os skrive den tilsvarende Java-driverkode ved hjælp af replaceOne metode:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age",18)
  .append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

I ovenstående kode har vi oprettet et dokument, hvormed det ældre dokument vil blive erstattet. Dokumentet med student_id 8764 vil blive erstattet med det nyoprettede dokument.

6. Brug af findOneAndReplace Metode

findOneAndReplace metode er en af ​​de avancerede opdateringsmetoder leveret af MongoDB, og den erstatter det første matchede dokument baseret på de givne udvælgelseskriterier. Som standard returnerer denne metode det originale dokument. Vi kan bruge forskellige muligheder for findOneAndReplace at sortere og projektere dokumenter, hvis det kræves.

Kort sagt, findOneAndReplace erstatter samlingens første matchende dokument på basis af det anvendte filter:

db.student.findOneAndReplace(
    { 
        "student_id" : { 
            $eq : 8764 
        }
    },
    { 
        "student_id" : 8764,
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    {
        returnNewDocument: false
    }
);

Denne forespørgsel returnerer følgende dokument:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 1",
    "age":16,
    "roll_no":199406
}

Hvis vi indstiller returnNewDocument til sand , vil handlingen så returnere det erstattede dokument i stedet:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 2",
    "age":18,
    "roll_no":199406
}

Lad os nu bruge findOneAndReplace metode til at projicere student_id og alder felter i det returnerede dokument:

db.student.findOneAndReplace(
    { 
        "student_id" : {
        $eq : 8764 
        } 
    },
    { 
        "student_id" : 8764, 
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    { 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "age" : 1 
        } 
    }
);

Outputtet af ovenstående forespørgsel vil kun indeholde de projekterede felter:

{
    "student_id":"8764",
    "age":16
}

Java-driverkoden for ovenstående forespørgsel med forskellige muligheder for findOneAndReplace:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age", 18)
  .append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
  Filters.eq("student_id", 8764), 
  replaceDocument,
  new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));

I ovenstående forespørgsel er findOneAndReplace metoden vil først sortere dokumenterne i stigende rækkefølge baseret på roll_no, og det nyoprettede dokument erstatter dokumentet med student_id "8764".

7. Brug af findOneAndUpdate Metode

findOneAndUpdate metode opdaterer det første matchede dokument i samlingen. Hvis mere end ét dokument matcher udvælgelseskriterierne, opdaterer det kun det første matchede dokument. Når vi opdaterer dokumentet, værdien af ​​_id feltet forbliver uændret:

db.student.findOneAndUpdate(
    { 
        "student_id" : 8764
    },
    { 
        $inc : { 
            "roll_no" : 5
        } 
    },
    { 
        sort: { 
            "roll_no" : 1 
        }, 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "address" : 1
        }
    }
);

Outputtet af forespørgslen vil kun indeholde studentId og adresse af det ældre dokument:

{
    "student_id":8764,
    "address":"Hostel 1"
}

Java-driverkoden for ovenstående forespørgsel ved hjælp af forskellige muligheder for findOneAndUpdate er som følger:

Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
  Filters.eq("student_id", 8764),
  Updates.inc("roll_no", 5), 
  new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

I dette tilfælde er findOneAndUpdate metoden vil først sortere dokumentet i stigende rækkefølge baseret på roll_no . Ovenstående forespørgsel øger roll_no  med 5 og returnerer derefter student_id og adresse felter.


  1. Visning af alle samlinger i en mongo-database i et nodejs-script

  2. MongoDB prik (.) i nøglenavn

  3. Sådan gør du:Inkluder tredjepartsbiblioteker i dit MapReduce-job

  4. Sådan konfigureres SELinux til MongoDB Replica Sets