MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie Dokumente in MongoDB

1. Übersicht

MongoDB ist eine plattformübergreifende, dokumentenorientierte Open-Source-NoSQL-Datenbank, die in C++ geschrieben ist. Darüber hinaus bietet MongoDB hohe Leistung, hohe Verfügbarkeit und automatische Skalierung.

Um die Dokumente in MongoDB zu aktualisieren, können wir verschiedene Methoden wie updateOne verwenden , findOneAndUpdate, etc. Weiterhin stellt MongoDB verschiedene Operatoren für die Update-Methoden zur Verfügung.

In diesem Lernprogramm werden verschiedene Ansätze zum Ausführen von Aktualisierungsvorgängen in MongoDB erörtert. Für jeden Ansatz besprechen wir zuerst die Mongo-Shell-Abfrage und dann ihre Implementierung in Java.

2. Datenbankeinrichtung

Bevor wir zu den Aktualisierungsabfragen übergehen, erstellen wir zuerst eine Datenbank, baeldung , und eine Beispielsammlung, student:

use baeldung;
db.createCollection(student);

Lassen Sie uns zur Veranschaulichung einige Dokumente zur Sammlung Student hinzufügen mit insertMany Abfrage:

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

Bei erfolgreicher Einfügung erhalten wir einen JSON mit acknowledged:true :

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

Lassen Sie uns nun tief in verschiedene Möglichkeiten eintauchen, um die Dokumente in MongoDB zu aktualisieren.

3. Verwenden von updateOne Methode

Ein Aktualisierungsvorgang in MongoDB kann durch Hinzufügen eines neuen Felds, Entfernen eines Felds oder Aktualisieren eines vorhandenen Felds erfolgen. Das updateOne  -Methode aktualisiert ein einzelnes Dokument in einer Sammlung basierend auf dem angewendeten Abfragefilter. Es findet zuerst das Dokument, das dem Filter entspricht, und aktualisiert dann die angegebenen Felder.

Außerdem können wir verschiedene Operatoren wie $set verwenden , $unset , $inc , etc., mit der Update-Methode.

Schauen wir uns zur Demonstration die Abfrage an, um ein einzelnes Dokument einer Sammlung zu aktualisieren:

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

Wir erhalten eine Ausgabe ähnlich der unten gezeigten:

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

Schauen wir uns nun den Java-Treibercode des obigen updateOne an Abfrage:

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

Hier haben wir zunächst den student_name verwendet Feld zum Filtern der Dokumente. Dann aktualisieren wir die Adresse des Dokuments mit student_name "Paul Starc".

4. Verwenden von updateMany Methode

Die updateMany -Methode aktualisiert alle Dokumente in MongoDB-Sammlungen, die dem angegebenen Filter entsprechen. Einer der Vorteile der Verwendung von updateMany ist, dass wir mehrere Dokumente aktualisieren können, ohne die Felder alter Dokumente zu verlieren.

Sehen wir uns die MongoDB-Shell-Abfrage mit updateMany an Methode:

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

Der obige Befehl gibt die folgende Ausgabe zurück:

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

Hier matchedCount enthält die Anzahl der übereinstimmenden Dokumente, während modifiedCount enthält die geänderte Dokumentennummer.

Sehen wir uns nun den Java-Treibercode mit updateMany an Methode:

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

Hier alle Dokumente mit Alter weniger als 20 werden gefiltert, und die Überprüfung wird auf true gesetzt .

5. Verwenden von replaceOne Methode

Das replaceOne Methode von MongoDB ersetzt das gesamte Dokument. Einer der Nachteile von replaceOne ist, dass alle älteren Felder durch die neuen Felder ersetzt werden und die älteren Felder auch verloren gehen:

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

In diesem Fall erhalten wir die folgende Ausgabe:

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

Wenn keine Übereinstimmungen gefunden werden, gibt die Operation matchedCount zurück als 0:

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

Lassen Sie uns den entsprechenden Java-Treibercode mit replaceOne schreiben Methode:

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

Im obigen Code haben wir ein Dokument erstellt, durch das das ältere Dokument ersetzt wird. Das Dokument mit student_id 8764 wird durch das neu erstellte Dokument ersetzt.

6. Verwenden von findOneAndReplace Methode

Das findOneAndReplace -Methode ist eine der erweiterten Aktualisierungsmethoden von MongoDB und ersetzt das erste übereinstimmende Dokument basierend auf den angegebenen Auswahlkriterien. Standardmäßig gibt diese Methode das Originaldokument zurück. Wir können verschiedene Optionen von findOneAndReplace verwenden um Dokumente bei Bedarf zu sortieren und zu projizieren.

Kurz gesagt, findOneAndReplace ersetzt das erste passende Dokument der Sammlung auf Basis des angewendeten Filters:

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

Diese Abfrage gibt das folgende Dokument zurück:

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

Wenn wir returnNewDocument festlegen auf wahr , würde die Operation dann stattdessen das ersetzte Dokument zurückgeben:

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

Lassen Sie uns nun findOneAndReplace verwenden Methode zum Projizieren der student_id und Alter Felder im zurückgegebenen 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 
        } 
    }
);

Die Ausgabe der obigen Abfrage enthält nur die projizierten Felder:

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

Der Java-Treibercode der obigen Abfrage mit verschiedenen Optionen von 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));

In der obigen Abfrage ist die findOneAndReplace -Methode sortiert die Dokumente zuerst in aufsteigender Reihenfolge basierend auf roll_no, und das neu erstellte Dokument ersetzt das Dokument durch student_id „8764“.

7. Verwenden von findOneAndUpdate Methode

Das findOneAndUpdate -Methode aktualisiert das erste übereinstimmende Dokument in der Sammlung. Wenn mehr als ein Dokument den Auswahlkriterien entspricht, wird nur das erste übereinstimmende Dokument aktualisiert. Wenn wir das Dokument aktualisieren, wird der Wert der _id Feld bleibt unverändert:

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

Die Ausgabe der Abfrage enthält nur die studentId und Adresse des älteren Dokuments:

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

Der Java-Treibercode der obigen Abfrage, der verschiedene Optionen von findOneAndUpdate verwendet lautet wie folgt:

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

In diesem Fall das findOneAndUpdate -Methode sortiert das Dokument zuerst in aufsteigender Reihenfolge basierend auf roll_no . Die obige Abfrage erhöht die roll_no  um 5 und gibt dann die student_id zurück und Adresse Felder.