sql >> Database >  >> NoSQL >> MongoDB

Bulkupdate van documenten in MongoDB

1. Overzicht

In deze zelfstudie kijken we naar het uitvoeren van bulkupdates en invoegbewerkingen in MongoDB. Bovendien biedt MongoDB API-aanroepen waarmee meerdere documenten in één handeling kunnen worden ingevoegd of opgehaald. MongoDB gebruikt de Array of Batch interfaces die de databaseprestaties aanzienlijk verbeteren door het aantal oproepen tussen de client en de database te verminderen.

In deze zelfstudie bekijken we beide oplossingen met MongoDB Shell en Java-stuurprogrammacode.

Laten we een duik nemen in het implementeren van het bulksgewijs bijwerken van documenten in MongoDB.

2. Database-initialisatie

Allereerst moeten we verbinding maken met de mongo-shell:

mongo --host localhost --port 27017

Stel nu een database in baeldung en een voorbeeldverzameling populaties :

use baeldung;
db.createCollection(populations);

Laten we wat voorbeeldgegevens toevoegen aan de verzameling populaties met behulp van 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
}]);

De bovenstaande insertMany query retourneert het volgende document:

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

Hier hebben we vier documenten ingevoegd in de bovenstaande query om alle soorten bulkschrijfbewerkingen in MongoDB uit te voeren.

De database baeldung is met succes aangemaakt en alle vereiste gegevens zijn ook ingevoegd in de verzameling populaties , dus we zijn klaar om de bulkupdate uit te voeren.

3. MongoDB Shell Query gebruiken

De bulkbewerkingsbuilder van MongoDB wordt gebruikt om een ​​lijst met schrijfbewerkingen in bulk samen te stellen voor een enkele verzameling. We kunnen bulkbewerkingen op 2 verschillende manieren initialiseren. De methode initializeOrderedBulkOp wordt gebruikt om bulkbewerkingen uit te voeren in de geordende lijst met schrijfbewerkingen. Een van de nadelen van de initializeOrderedBulkOp is dat als er een fout optreedt tijdens het verwerken van schrijfbewerkingen, MongoDB terugkeert zonder de resterende schrijfbewerkingen in de lijst te verwerken.

We kunnen methoden voor invoegen, bijwerken, vervangen en verwijderen gebruiken om verschillende soorten bewerkingen uit te voeren in een enkele DB-aanroep. Laten we ter illustratie eens kijken naar de bulk-schrijfbewerkingsquery met behulp van de MongoDB-shell:

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

De bovenstaande bulkWrite query retourneert het volgende document:

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

Hier, in de bovenstaande query, hebben we alle soorten schrijfbewerkingen uitgevoerd, d.w.z. insertOne , updateOne , deleteOne , replaceOne .

Eerst gebruikten we insertOne methode om een ​​nieuw document in de verzameling in te voegen. Ten tweede gebruikten we updateOne om het document van cityName bij te werken "Nieuw-Delhi". Later gebruikten we de deleteOne methode om een ​​document uit de collectie te verwijderen op basis van het filter. Ten slotte gebruikten we replaceOne  om een ​​volledig document te vervangen met filter cityName "New York".

4. Java-stuurprogramma gebruiken

We hebben de MongoDB-shellquery besproken om de bulkschrijfbewerkingen uit te voeren. Voordat we de bulkschrijfbewerking maken, maken we eerst een MongoClient verband met de verzameling populaties van de database baeldung :

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

Hier hebben we de verbinding gemaakt met de MongoDB-server, die draait op standaardpoort 27017. Laten we nu dezelfde bulkbewerkingen implementeren met de Java-code:

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 hebben we eerst een lijst gemaakt met writeModel om alle verschillende soorten schrijfbewerkingen toe te voegen aan één updatelijst. Verder gebruikten we InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel , en ReplaceOneModel in onze vraag. Ten slotte, de bulkWrite methode voerde alle bewerkingen tegelijk uit.


  1. Tornado-fout:[Errno 24] Fout te veel geopende bestanden

  2. Mongoose:findOneAndUpdate retourneert geen bijgewerkt document

  3. Combineer volledige tekst met andere index

  4. Verbinding met MongoDB controleren