5.4 KiB
5.4 KiB
🥬 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:
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
Poslední revize: 2026-06-03