# 🥬 MongoDB ## Přehled MongoDB je nejrozšířenější document-oriented NoSQL databáze. Ukládá data jako BSON (binární JSON) dokumenty s flexibilním schematem. Vhodná pro aplikace s rychlým vývojem, kde schema často migruje nebo je různorodé. ## Data model - **Database** → Collection → Document (JSON/BSON) - **Document** — pole s klíč-hodnota, vnořené objekty, pole - **Flexibilní schema** — každý dokument může mít jiná pole (ale nedoporučuje se) - **ObjectID** — výchozí primární klíč (12-bajtový: timestamp + machine + PID + counter) ## Architektura ``` mongod (jednotlivý node) ├── WiredTiger storage engine (výchozí od 3.2) │ ├── B-Tree indexy (B-Tree, ne LSM) │ ├── MVCC (snapshot isolation) │ ├── Compression (zlib, snappy, zstd) │ └── Cache (WiredTiger internal cache) ├── Replication (replica set) │ ├── Primary (všechny zápisy) │ └── Secondary (replikace, volitelné čtení) └── Sharding (cluster) ├── mongos (router) ├── Config servers (metadata) └── Shards (replica sets) ``` ### Replica set - Primární node = všechny zápisy, sekundární = replikace (oplog) - Automatický failover (election mezi sekundáry) - Až 50 nodeů v replica setu, max 7 voting nodes - Read preference: primary (default), primaryPreferred, secondary, secondaryPreferred, nearest ### Sharding - Shard klíč = rozhodující pro distribuci - **Range sharding** — blízká data na stejném shardu (good for range queries, risk of hot spots) - **Hashed sharding** — rovnoměrná distribuce (good for write throughput, bad for range queries) - **Zoned sharding** — data umístěna podle zón (geo-distribuce, compliance) ## Index types | Typ | Popis | |-----|-------| | **Single field** | Standard B-Tree index | | **Compound** | Více polí v indexu (order matters) | | **Multikey** | Index na pole (array) — každá hodnota samostatně | | **Text** | Full-text search | | **Geospatial (2d, 2dsphere)** | Geo dotazy (near, within, intersect) | | **Hashed** | Pro hashed sharding | | **TTL** | Automatické mazání dokumentů po expiraci | | **Wildcard** | Index na neznámá/nepravidelná pole | ## Aggregation pipeline MongoDB pipeline framework pro transformace dat: ```javascript db.orders.aggregate([ { $match: { status: "shipped" } }, { $group: { _id: "$customer_id", total: { $sum: "$amount" } } }, { $sort: { total: -1 } }, { $limit: 10 } ]) ``` ## Doporučení — v čem je MongoDB lepší | Oblast | MongoDB | Konkurence | Proč MongoDB | |--------|---------|------------|--------------| | **Flexibilní schema** | Schema-less, změny bez migrace | PostgreSQL (ALTER TABLE + migration) | Rychlý vývoj, MVP, časté změny modelu | | **JSON / dokumenty** | Nativní BSON, vnořené objekty | PostgreSQL (jsonb, ale chybí $ operators) | Jednodušší mapování objektů z kódu | | **Horizontal scaling** | Nativní sharding (mongos + config) | MySQL (Vitess externí) | Vestavěný, jednoduchý na setup | | **Geo-distribuce** | Zoned sharding, replica set per region | Cassandra (AP model, jiná filozofie) | CP z CAP, konzistence + distribuce | | **Agregace** | Aggregation pipeline, $lookup (LEFT JOIN) | PostgreSQL (SQL JOINy, výkonnější) | Užitečné pro denormalizovaná data | | **Rychlost developmentu** | ORM-like (Mongoose), JSON přirozený | SQL (schema first, migrace) | Nejrychlejší time-to-market | ### Kdy použít MongoDB - **Rychlý vývoj / MVP** — schema evolves frequently, žádné migrace - **Katalogová data** — produkty s různými atributy (e-commerce, marketplace) - **Content management** — různorodý obsah (blog, CMS, headless CMS) - **Real-time analytics** — agregace, dashboardy, event data - **IoT / senzorová data** — různorodé struktury zpráv - **Mobilní aplikace** — JSON dokumenty přirozeně mapují API response ### Kdy použít něco jiného - **Finanční transakce** → PostgreSQL (ACID, referenční integrita) - **Komplexní reporty / JOINy** → PostgreSQL nebo ClickHouse - **Vztahová data (friends, follows)** → Neo4j (grafová DB) - **High-throughput zápisů** → Cassandra (AP model, bez master bottlenecku) - **Malá data, jeden server** → SQLite (jednodušší, žádný daemon) ## MongoDB licensing MongoDB změnila licenci v roce 2018 z GNU AGPL v3 na **SSPL** (Server Side Public License): | Varianta | Licence | Cena | Podmínky | |----------|---------|------|----------| | **MongoDB Community** | SSPL | Zdarma | SSPL: pokud nabízíte MongoDB jako managed službu, musíte uvolnit celý stack (vč. orchestrace, monitoringu) jako open source. Interní použití bez omezení | | **MongoDB Enterprise Advanced** | Komerční | ~$10 000/server/rok (Atlas: pay-per-use) | Enterprise funkce (LDAP, Kerberos, auditing, encryption), support 24/7 | | **MongoDB Atlas** | Managed | Pay-per-use (~$0.10-5.00/hod dle instance) | Plně managed, multi-cloud, auto-scaling, backup, monitoring | **Dopad**: SSPL je podobný model jako u Redis — pro self-hosted interní použití bez omezení, cloud poskytovatelé (AWS, Azure) nesmí nabízet MongoDB jako managed službu bez komerční dohody. Alternativa: **FerretDB** (open source proxy kompatibilní s MongoDB wire protokolem). ## Zdroje Odkazy, knihy a standardy: [sources/databases/sources.md](sources/databases/sources.md) *Poslední revize: 2026-06-03*