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

Massenaktualisierung von Dokumenten in MongoDB

1. Übersicht

In diesem Tutorial sehen wir uns die Durchführung von Massenaktualisierungen und Einfügevorgängen in MongoDB an. Darüber hinaus bietet MongoDB API-Aufrufe, die das Einfügen oder Abrufen mehrerer Dokumente in einem einzigen Vorgang ermöglichen. MongoDB verwendet das Array oder Batch Schnittstellen, die die Datenbankleistung erheblich verbessern, indem sie die Anzahl der Aufrufe zwischen dem Client und der Datenbank reduzieren.

In diesem Tutorial sehen wir uns beide Lösungen an, die MongoDB Shell und Java-Treibercode verwenden.

Lassen Sie uns in die Implementierung der Massenaktualisierung von Dokumenten in MongoDB eintauchen.

2. Datenbankinitialisierung

Zuerst müssen wir uns mit der Mongo-Shell verbinden:

mongo --host localhost --port 27017

Richten Sie jetzt eine Datenbank baeldung ein und eine Beispielsammlung Populationen :

use baeldung;
db.createCollection(populations);

Fügen wir der Sammlung Populationen einige Beispieldaten hinzu mit insertMany Methode:

db.populations.insertMany([
{
    "cityId":1124,
    "cityName":"New York",
    "countryName":"United States",
    "continentName":"North America",
    "population":22
},
{
    "cityId":1125,
    "cityName":"Mexico City",
    "countryName":"Mexico",
    "continentName":"North America",
    "population":25
},
{
    "cityId":1126,
    "cityName":"New Delhi",
    "countryName":"India",
    "continentName":"Asia",
    "population":45
},
{
    "cityId":1134,
    "cityName":"London",
    "countryName":"England",
    "continentName":"Europe",
    "population":32
}]);

Die obige insertMany Die Abfrage gibt das folgende Dokument zurück:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("623575049d55d4e137e477f6"),
        ObjectId("623575049d55d4e137e477f7"),
        ObjectId("623575049d55d4e137e477f8"),
        ObjectId("623575049d55d4e137e477f9")
    ]
}

Hier haben wir vier Dokumente in die obige Abfrage eingefügt, um alle Arten von Massenschreibvorgängen in MongoDB auszuführen.

Die Datenbank baeldung wurde erfolgreich erstellt, und alle erforderlichen Daten werden auch in die Sammlung Populationen eingefügt , sodass wir bereit sind, die Massenaktualisierung durchzuführen.

3. Verwenden der MongoDB-Shell-Abfrage

Der Builder für Massenoperationen von MongoDB wird verwendet, um eine Liste von Schreiboperationen in großen Mengen für eine einzelne Sammlung zu erstellen. Wir können Massenoperationen auf zwei verschiedene Arten initialisieren. Die Methode initializeOrderedBulkOp wird verwendet, um Massenoperationen in der geordneten Liste von Schreiboperationen auszuführen. Einer der Nachteile von initializeOrderedBulkOp ist, dass MongoDB zurückkehrt, wenn während der Verarbeitung von Schreibvorgängen ein Fehler auftritt, ohne die verbleibenden Schreibvorgänge in der Liste zu verarbeiten.

Wir können Methoden zum Einfügen, Aktualisieren, Ersetzen und Entfernen verwenden, um verschiedene Arten von Operationen in einem einzigen DB-Aufruf auszuführen. Sehen wir uns zur Veranschaulichung die Abfrage des Massenschreibvorgangs mit der MongoDB-Shell an:

db.populations.bulkWrite([
    { 
        insertOne :
            { 
                "document" :
                    {
                        "cityId":1128,
                        "cityName":"Kathmandu",
                        "countryName":"Nepal",
                        "continentName":"Asia",
                        "population":12
                    }
            }
    },
    { 
        insertOne :
            { 
                "document" :
                    {
                        "cityId":1130,
                        "cityName":"Mumbai",
                        "countryName":"India",
                        "continentName":"Asia",
                        "population":55
                    }
            }
    },
    { 
        updateOne :
            { 
                "filter" : 
                     { 
                         "cityName": "New Delhi"
                     },
                 "update" : 
                     { 
                         $set : 
                         { 
                             "status" : "High Population"
                         } 
                     }
            }
    },
    { 
        updateMany :
            { 
                "filter" : 
                     { 
                         "cityName": "London"
                     },
                 "update" : 
                     { 
                         $set : 
                         { 
                             "status" : "Low Population"
                         } 
                     }
            }
    },
    { 
        deleteOne :
            { 
                "filter" : 
                    { 
                        "cityName":"Mexico City"
                    } 
            }
    },
    { 
        replaceOne :
            {
                "filter" : 
                    { 
                        "cityName":"New York"
                    },
                 "replacement" : 
                    {
                        "cityId":1124,
                        "cityName":"New York",
                        "countryName":"United States",
                        "continentName":"North America",
                        "population":28
                    }
             }
    }
]);

Das obige bulkWrite Die Abfrage gibt das folgende Dokument zurück:

{
    "acknowledged" : true,
    "deletedCount" : 1,
    "insertedCount" : 2,
    "matchedCount" : 3,
    "upsertedCount" : 0,
    "insertedIds" : 
        {
            "0" : ObjectId("623575f89d55d4e137e477f9"),
            "1" : ObjectId("623575f89d55d4e137e477fa")
        },
    "upsertedIds" : {}
}

Hier, in der obigen Abfrage, haben wir alle Arten von Schreiboperationen durchgeführt, d. h. insertOne , updateOne , deleteOne , replaceOne .

Zuerst haben wir insertOne verwendet Methode, um ein neues Dokument in die Sammlung einzufügen. Zweitens haben wir updateOne verwendet um das Dokument von cityName zu aktualisieren "Neu-Delhi". Später haben wir deleteOne verwendet Methode zum Löschen eines Dokuments aus der Sammlung basierend auf dem Filter. Schließlich haben wir replaceOne  verwendet um ein komplettes Dokument mit dem Filter cityName zu ersetzen „New York“.

4. Java-Treiber verwenden

Wir haben die MongoDB-Shell-Abfrage besprochen, um die Massenschreibvorgänge durchzuführen. Bevor wir den Massenschreibvorgang erstellen, erstellen wir zunächst einen MongoClient Zusammenhang mit der Sammlung Populationen der Datenbank baeldung :

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

Hier haben wir die Verbindung mit dem MongoDB-Server erstellt, der auf dem Standardport 27017 ausgeführt wird. Lassen Sie uns nun dieselben Massenoperationen mit dem Java-Code implementieren:

List<WriteModel<Document>> writeOperations = new ArrayList<WriteModel<Document>>();
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1128)
  .append("cityName", "Kathmandu")
  .append("countryName", "Nepal")
  .append("continentName", "Asia")
  .append("population", 12)));
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1130)
  .append("cityName", "Mumbai")
  .append("countryName", "India")
  .append("continentName", "Asia")
  .append("population", 55)));
writeOperations.add(new UpdateOneModel<Document>(new Document("cityName", "New Delhi"),
  new Document("$set", new Document("status", "High Population"))
));
writeOperations.add(new UpdateManyModel<Document>(new Document("cityName", "London"),
  new Document("$set", new Document("status", "Low Population"))
));
writeOperations.add(new DeleteOneModel<Document>(new Document("cityName", "Mexico City")));
writeOperations.add(new ReplaceOneModel<Document>(new Document("cityId", 1124), 
  new Document("cityName", "New York").append("cityName", "United States")
    .append("continentName", "North America")
    .append("population", 28)));
BulkWriteResult bulkWriteResult = collection.bulkWrite(writeOperations);
System.out.println("bulkWriteResult:- " + bulkWriteResult);

Hier haben wir zuerst eine Liste von writeModel erstellt um alle verschiedenen Arten von Schreibvorgängen in einer einzigen Aktualisierungsliste hinzuzufügen. Außerdem haben wir InsertOneModel verwendet , UpdateOneModel , UpdateManyModel , DeleteOneModel und ReplaceOneModel in unserer Abfrage. Schließlich das bulkWrite -Methode führte alle Operationen auf einmal aus.