sql >> Databasteknik >  >> NoSQL >> MongoDB

Massuppdatering av dokument i MongoDB

1. Översikt

I den här handledningen kommer vi att titta på att utföra massuppdateringar och infoga operationer i MongoDB. Dessutom tillhandahåller MongoDB API-anrop som tillåter att infoga eller hämta flera dokument i en enda operation. MongoDB använder Array eller Batch gränssnitt som avsevärt förbättrar databasprestanda genom att minska antalet samtal mellan klienten och databasen.

I den här handledningen kommer vi att titta på både lösningarna som använder MongoDB Shell och Java-drivrutinskod.

Låt oss dyka in i implementeringen av massuppdatering av dokument i MongoDB.

2. Databasinitiering

Först och främst måste vi ansluta till mongo-skalet:

mongo --host localhost --port 27017

Nu, skapa en databas baeldung och en exempelsamling populationer :

use baeldung;
db.createCollection(populations);

Låt oss lägga till några exempeldata i samlingens populationer med insertMany metod:

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

Ovanstående insertMany query returnerar följande dokument:

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

Här infogade vi fyra dokument i ovanstående fråga för att utföra alla typer av bulk-skrivoperationer i MongoDB.

Databasen baeldung har skapats framgångsrikt, och all nödvändig data infogas också i samlingens populationer , så vi är redo att utföra massuppdateringen.

3. Använda MongoDB Shell Query

Bulkoperationsbyggaren av MongoDB används för att konstruera en lista över skrivoperationer i bulk för en enda samling. Vi kan initiera bulkoperationer på 2 olika sätt. Metoden initializeOrderedBulkOp används för att utföra bulkoperationer i den ordnade listan med skrivoperationer. En av nackdelarna med initializeOrderedBulkOp är att om ett fel uppstår under bearbetning av skrivoperationer, kommer MongoDB att återvända utan att bearbeta de återstående skrivoperationerna i listan.

Vi kan använda metoder för att infoga, uppdatera, ersätta och ta bort för att utföra olika typer av operationer i ett enda DB-anrop. Som en illustration, låt oss titta på bulk-skrivoperationsfrågan med MongoDB-skalet:

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

Ovanstående bulkWrite query returnerar följande dokument:

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

Här, i ovanstående fråga, utförde vi alla typer av skrivoperationer, d.v.s. insertOne , updateOne , deleteOne , ersätt en .

Först använde vi insertOne metod för att infoga ett nytt dokument i samlingen. För det andra använde vi updateOne för att uppdatera dokumentet för stadsnamn "Nya Delhi". Senare använde vi deleteOne metod för att ta bort ett dokument från samlingen baserat på filtret. Slutligen använde vi replaceOne  för att ersätta ett komplett dokument med filter stadsnamn "New York".

4. Använder Java-drivrutin

Vi har diskuterat MongoDB-skalfrågan för att utföra bulkskrivoperationerna. Innan vi skapar bulkskrivoperationen, låt oss först skapa en MongoClient anslutning till samlingens populationer av databasen baeldung :

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

Här skapade vi anslutningen till MongoDB-servern, som körs på standardport 27017. Låt oss nu implementera samma bulkoperationer med Java-koden:

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

Här skapade vi först en lista med writeModel för att lägga till alla olika typer av skrivoperationer i en enda uppdateringslista. Dessutom använde vi InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel och ReplaceOneModel i vår fråga. Slutligen, den bulkWrite metod utförde alla operationer på en gång.


  1. Hur kan jag poppa objekt från Redis när de läggs till i realtid?

  2. Använder MongoDB som datakälla i GoLang

  3. Hur förbättrar jag Redis-serverns CPU-användning?

  4. vad är den genomsnittliga skillnaden mellan Nest och redis-namespace juveler när vi använder redis med rails/ruby