1. Přehled
V tomto tutoriálu se podíváme na provádění hromadných aktualizací a operací vkládání v MongoDB. MongoDB navíc poskytuje volání API, která umožňují vložení nebo načtení více dokumentů v jedné operaci. MongoDB používá Array nebo Dávka rozhraní, která výrazně zlepšují výkon databáze snížením počtu volání mezi klientem a databází.
V tomto tutoriálu se podíváme na obě řešení využívající MongoDB Shell a kód ovladače Java.
Pojďme se ponořit do implementace hromadné aktualizace dokumentů v MongoDB.
2. Inicializace databáze
Nejprve se musíme připojit k mongo shellu:
mongo --host localhost --port 27017
Nyní nastavte databázi baeldung a ukázková kolekce populací :
use baeldung;
db.createCollection(populations);
Pojďme přidat některá ukázková data do kolekce populace pomocí insertMany metoda:
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
}]);
Výše uvedené vložte mnoho dotaz vrátí následující dokument:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623575049d55d4e137e477f6"),
ObjectId("623575049d55d4e137e477f7"),
ObjectId("623575049d55d4e137e477f8"),
ObjectId("623575049d55d4e137e477f9")
]
}
Zde jsme do výše uvedeného dotazu vložili čtyři dokumenty, abychom provedli všechny typy operací hromadného zápisu v MongoDB.
Databáze baeldung byla úspěšně vytvořena a všechna požadovaná data jsou také vložena do kolekce populace , takže jsme připraveni provést hromadnou aktualizaci.
3. Pomocí MongoDB Shell Query
Tvůrce hromadných operací MongoDB se používá k hromadnému sestavení seznamu operací zápisu pro jednu kolekci. Hromadné operace můžeme inicializovat 2 různými způsoby. Metoda initializeOrderedBulkOp slouží k provádění hromadných operací v uspořádaném seznamu operací zápisu. Jedna z nevýhod initializeOrderedBulkOp spočívá v tom, že pokud dojde k chybě při zpracování jakékoli operace zápisu, MongoDB se vrátí bez zpracování zbývajících operací zápisu v seznamu.
Můžeme použít metody vložení, aktualizace, nahrazení a odebrání k provádění různých typů operací v jediném volání DB. Pro ilustraci se podívejme na dotaz operace hromadného zápisu pomocí prostředí 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
}
}
}
]);
Výše uvedený bulkWrite dotaz vrátí následující dokument:
{
"acknowledged" : true,
"deletedCount" : 1,
"insertedCount" : 2,
"matchedCount" : 3,
"upsertedCount" : 0,
"insertedIds" :
{
"0" : ObjectId("623575f89d55d4e137e477f9"),
"1" : ObjectId("623575f89d55d4e137e477fa")
},
"upsertedIds" : {}
}
Zde jsme ve výše uvedeném dotazu provedli všechny typy operací zápisu, tj. insertOne , updateOne , deleteOne , replaceOne .
Nejprve jsme použili insertOne způsob vložení nového dokumentu do kolekce. Za druhé jsme použili updateOne k aktualizaci dokumentu cityName "Nové Dillí". Později jsme použili deleteOne metoda k odstranění dokumentu z kolekce na základě filtru. Nakonec jsme použili replaceOne k nahrazení celého dokumentu filtrem cityName „New York“.
4. Pomocí ovladače Java
Probrali jsme Shell dotaz MongoDB pro provádění operací hromadného zápisu. Před vytvořením operace hromadného zápisu nejprve vytvořte MongoClient spojení se sbírkou populace databáze baeldung :
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("populations");
Zde jsme vytvořili spojení se serverem MongoDB běžícím na výchozím portu 27017. Pojďme nyní implementovat stejné hromadné operace pomocí kódu 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);
Zde jsme nejprve vytvořili seznam writeModel přidat všechny různé typy operací zápisu do jednoho seznamu aktualizací. Dále jsme použili InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel a ReplaceOneModel v našem dotazu. Nakonec bulkWrite metoda provedla všechny operace najednou.