Manipulace s objekty v MongoDB
30.01.2021Tento článek slouží jako rychlý tahák (cheat sheet) pro základní CRUD operace nad MongoDB objektovou databází. Všechny kódy jsou nahrané na GitHub.
Slovníček
MongoDB | MongoDB je open source objektová (NoSQL; document oriented) databáze, kterou lze horizontálně škálovat. První verze vyšla již v roce 2009. |
CRUD | Zkratka pro Create, Read, Update a Delete operace. |
NoSQL | Databáze, která ukládá data v nerelační podobě. |
Horizontální škálování (horizontal scaling) | Přidávání dalších serverů pro zvýšení výkonu (scaling out). Alternativou je vertikální škálování (scaling up), kdy se vylepšuje stávající server například dokoupením paměti RAM nebo nákupem silnějšího procesoru. |
Obsah
Úvod
MongoDB ukládá data v podobě BSON formátu (Binary JSON) a používá tzv. kolekce, což je obdoba databázové tabulky, která ale může obsahovat data s rozdílnou strukturou. Toho lze využít pokud například potřebujeme uložit nějaká aplikační data a pak si je zase načíst zpátky, aniž bychom museli použít objektově relační mapování. Využít databázi lze také jako úložiště pro big data nebo event driven architekturu a další.
Instalace
Před použitím potřebujeme nejdříve databázi stáhnout a nainstalovat. Stáhneme si community server (pro windows v podobě .msi balíčku), který spustíme. Po instalaci můžeme databázi vidět a spustit/zastavit v snap-in modulu služeb (Win + R > services.msc)
Compass GUI klient
Compass je aplikace, pomocí které můžeme ručně procházet databázi a dělat v ní základní operace (zakládat databáze, kolekce, procházet data, měnit data, ...). Compass můžeme stáhnout zde a úvodní obrazovka vypadá takto (pokud se nezadá connection string, tak se compass automaticky připojí na localhost)
Použití v C# aplikaci
Vytvoříme si nový .net core projekt a pomocí Nuget package managera si nainstalujeme MongoDB driver, který nám umožní se k databázi připojit. Driver obsahuje IFindFluent a IFindFluentExtensions interface, který mimikuje LINQ metody, takže se s databází velmi dobře pracuje.
Install-Package mongodb.driver
Následují základní CRUD operace
// Connect
var Client = new MongoClient("mongodb://localhost:27017");
// Get database
IMongoDatabase Database = Client.GetDatabase("ApplicationOne");
// Create collection if not already created in compass
Database.CreateCollection("Customer");
// Get collection
IMongoCollection<Customer> _customers =
Database.GetCollection<Customer>("Customer");
// Prepare object
var customer = new Customer("John", "Doe");
// Add object
_customers.InsertOne(customer);
// Update object
customer.AddTelephone("+123 456 789 012");
_customers.ReplaceOne(x => x.Id == customer.Id, customer);
// Delete object
_customers.DeleteOne(x => x.Id == customer.Id);
// Receive all objects in collection
var retrievedCustomers = _customers.Find(x => true).ToList();
// Receive specific object in collection
var customer =
_customers
.Find(x => x.Id == customer.Id)
.SingleOrDefault();
V Compassu pak můžeme procházet, editovat a filtrovat kolekce. Filtrování se provádí zadáním JSON objektu s hodnoty, které chceme najít. Pokud programově vkládáme do kolekce, která neexistuje tak se vytvoří (a s ní případně i databáze, pokud neexistuje) a pokud kolekci smažeme tak se automaticky smaže i databáze (databáze existuje společně s kolekcí). Na obrázku jsou zobrazeny všechny objekty v kolekci, které mají příjmeno "Doe".
Závěr
MongoDB je dalším nástrojem, který můžeme použít při návrhu architektury. Hodí se pokud potřebujeme objekty ukládat v nerelační podobě a také nám umožňuje horizontálně škálovat. Určitě se nejedná o náhradu relačních databází a nějaké složité reporting služby bych nad tím pravděpodobně nevytvářel, nicméně v mnoha případech se může jednat o lepší volbu než je klasická databáze. Pokud máte s touto databází zkušenost, budu rád pokud se o ní podělíte v komentáři :-)