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ý napodobuje LINQ metody, což usnadňuje práci s databází.

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 můžeme procházet, editovat a filtrovat kolekce. Filtrování se provádí zadáním JSON objektu s hodnotami, které chceme najít. Pokud programově vkládáme do kolekce, která neexistuje, tak se kolekce vytvoří a s ní případně i databáze, pokud neexistuje. 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říjmení "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 případně horizontálně škálovat. Nejedná se o náhradu relačních databází, nicméně v některých případech se může jednat o lepší volbu. Pokud máte s touto databází zkušenost, budu rád, pokud se o ni podělíte v komentáři. :-)

Odkazy