sql >> Database >  >> NoSQL >> MongoDB

Push en Set-bewerkingen in dezelfde MongoDB-update

1. Overzicht

$push is een update-operator in MongoDB die de waarde in een array toevoegt. In tegenstelling, de $set operator wordt gebruikt om de waarde van een bestaand veld in het document bij te werken.

In deze korte zelfstudie laten we zien hoe u $push . uitvoert en $set bewerkingen samen in een enkele update-query.

2. Database-initialisatie

Voordat we verder gaan met het uitvoeren van de meervoudige update-bewerkingen, moeten we eerst een database baeldung opzetten en monsterverzameling merken :

use baeldung;
db.createCollection(marks);

Laten we een paar documenten invoegen in de verzameling markeringen met behulp van de insertMany methode van de 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
            }
        ]
    }
]);

Na succesvolle invoeging zal de bovenstaande vraag het volgende antwoord opleveren:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
        ObjectId("622300cc85e943405d04b568")
    ]
}

Tot nu toe hebben we met succes een paar voorbeelddocumenten ingevoegd in de verzameling markeringen .

3. Het probleem begrijpen

Laten we, om het probleem te begrijpen, eerst het document begrijpen dat we zojuist hebben ingevoegd. Het bevat de studentgegevens en de door hen behaalde cijfers voor verschillende vakken. De totalMarks  is de som van de punten die zijn behaald in verschillende vakken.

Laten we eens kijken naar een situatie waarin we een nieuw onderwerp willen toevoegen in de subjectDetails reeks. Om de gegevens ook consistent te maken, moeten we de totalMarks . bijwerken veld ook.

In MongoDB voegen we eerst het nieuwe onderwerp toe aan de array met de $push exploitant. Vervolgens stellen we de totalMarks . in veld naar een bepaalde waarde met behulp van de $set telefoniste.

Beide bewerkingen kunnen afzonderlijk worden uitgevoerd met de $push en $set exploitant resp. Maar we kunnen de MongoDB-query schrijven om beide bewerkingen samen uit te voeren.

4. De MongoDB Shell-query gebruiken

In MongoDB kunnen we meerdere velden van een document bijwerken met behulp van de verschillende update-operators. Hier gebruiken we beide $push en $set operators samen in een updateOne vraag.

Laten we eens kijken naar het voorbeeld met zowel $push en $set operators samen:

db.marks.updateOne(
    {
        "studentId": 1023
    },
    {
        $set: {
            totalMarks: 170
        },
        $push: {
            "subjectDetails":{
                "subjectId": 126,
                "subjectName": "Java Programming",
                "marks": 70
            }
        }
    }
);

Hier, in de bovenstaande query, hebben we de filterquery toegevoegd op basis van de studentId. Zodra we het gefilterde document hebben ontvangen, werken we de totalMarks . bij met behulp van de $set-operator. Daarnaast voegen we de nieuwe onderwerpgegevens in de subjectDetails array met behulp van de $push telefoniste.

Als resultaat zal de bovenstaande vraag de volgende output opleveren:

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

Hier, de matchedCount bevat het aantal documenten dat overeenkwam met het filter, terwijl de modifiedCount bevat het aantal gewijzigde documenten.

5. Java-stuurprogrammacode

Tot dusver hebben we de mongo-shell-query besproken om de $push . te gebruiken en $set exploitant samen. Hier leren we hetzelfde te implementeren met behulp van de Java-stuurprogrammacode.

Voordat we verder gaan, laten we eerst verbinding maken met de DB en de vereiste verzameling:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");

Hier maken we verbinding met MongoDB, die draait op standaardpoort 27017 op localhost.

Laten we nu eens kijken naar de Java-stuurprogrammacode:

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)));

In dit codefragment hebben we de updateOne . gebruikt methode, die slechts één document bijwerkt op basis van het toegepaste filter studentId 1023. We gebruikten toen de Updates.combine om meerdere bewerkingen in één gesprek uit te voeren. Het veld totalMarks zal worden bijgewerkt naar 170, en een nieuw document subjectData zal naar het arrayveld worden gepusht “subjectDetails” .


  1. MongoDB-geheugengebruik bijhouden

  2. MongoDB findOneAndReplace()

  3. Is er een manier om automatisch een nieuw clusterknooppunt-IP te ontdekken in Redis Cluster met Lettuce?

  4. Redis versus RabbitMQ als een gegevensmakelaar / berichtensysteem tussen Logstash en elasticsearch