Manipulace s objekty v MongoDB

30.01.2021

Tento č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 :-)

Odkazy