MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiornamento in blocco di documenti in MongoDB

1. Panoramica

In questo tutorial, esamineremo l'esecuzione di aggiornamenti in blocco e le operazioni di inserimento in MongoDB. Inoltre, MongoDB fornisce chiamate API che consentono di inserire o recuperare più documenti in un'unica operazione. MongoDB utilizza l'Array o Lotto interfacce che migliorano notevolmente le prestazioni del database riducendo il numero di chiamate tra il client e il database.

In questo tutorial, esamineremo entrambe le soluzioni che utilizzano MongoDB Shell e il codice del driver Java.

Diamo un'occhiata all'implementazione dell'aggiornamento in blocco dei documenti in MongoDB.

2. Inizializzazione database

Prima di tutto, dobbiamo connetterci alla mongo shell:

mongo --host localhost --port 27017

Ora, imposta un database baeldung e una raccolta di campioni popolazioni :

use baeldung;
db.createCollection(populations);

Aggiungiamo alcuni dati di esempio nella raccolta popolazioni utilizzando insertMany metodo:

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

Quanto sopra insertMany query restituirà il seguente documento:

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

Qui, abbiamo inserito quattro documenti nella query precedente per eseguire tutti i tipi di operazioni di scrittura in blocco in MongoDB.

Il database baeldung è stato creato correttamente e tutti i dati richiesti vengono inseriti anche nella raccolta popolazioni , quindi siamo pronti per eseguire l'aggiornamento collettivo.

3. Utilizzo della query della shell MongoDB

Il generatore di operazioni in blocco di MongoDB viene utilizzato per costruire un elenco di operazioni di scrittura in blocco per una singola raccolta. Possiamo inizializzare le operazioni di massa in 2 modi diversi. Il metodo inizializzaOrderedBulkOp viene utilizzato per eseguire operazioni di massa nell'elenco ordinato di operazioni di scrittura. Uno degli svantaggi di initializeOrderedBulkOp è che se si verifica un errore durante l'elaborazione di qualsiasi operazione di scrittura, MongoDB restituirà senza elaborare le restanti operazioni di scrittura nell'elenco.

Possiamo utilizzare i metodi di inserimento, aggiornamento, sostituzione e rimozione per eseguire diversi tipi di operazioni in una singola chiamata DB. A titolo illustrativo, esaminiamo la query dell'operazione di scrittura in blocco utilizzando la shell MongoDB:

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

Quanto sopra bulkWrite query restituirà il seguente documento:

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

Qui, nella query precedente, abbiamo eseguito tutti i tipi di operazioni di scrittura, ovvero insertOne , updateOne , deleteOne , replaceOne .

Innanzitutto, abbiamo utilizzato insertOne metodo per inserire un nuovo documento nella raccolta. In secondo luogo, abbiamo utilizzato updateOne per aggiornare il documento di cityName "Nuova Delhi". Successivamente, abbiamo utilizzato deleteOne metodo per eliminare un documento dalla raccolta in base al filtro. Infine, abbiamo utilizzato replaceOne  per sostituire un documento completo con il filtro cityName “New York”.

4. Utilizzo del driver Java

Abbiamo discusso della query della shell MongoDB per eseguire le operazioni di scrittura in blocco. Prima di creare l'operazione di scrittura in blocco, creiamo innanzitutto un MongoClient collegamento con la collezione popolazioni della banca dati baeldung :

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

Qui abbiamo creato la connessione con il server MongoDB, in esecuzione sulla porta predefinita 27017. Implementiamo ora le stesse operazioni di massa utilizzando il codice Java:

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

Qui, abbiamo prima creato un elenco di writeModel per aggiungere tutti i diversi tipi di operazioni di scrittura in un unico elenco di aggiornamento. Inoltre, abbiamo utilizzato InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel e ReplaceOneModel nella nostra domanda. Infine, il bulkWrite metodo eseguito tutte le operazioni in una volta.