Content Management Systems
Content management systems (CMS) and headless platforms are the original "killer app" for MongoDB.
Introduction
Content management systems (CMS) and headless platforms are the original "killer app" for MongoDB. Pages, blocks, components, drafts and locales all have wildly different shapes — a relational schema collapses under the requirement, while documents fit perfectly.
This is why Strapi, Payload CMS, KeystoneJS, Forbes CMS, Hygraph and most modern headless platforms either run on MongoDB or recommend it as the primary store.
Understanding the topic
Canonical CMS collections:
- pages — slug, locale, status (
draft/published), blocks array. - blocks embedded inside pages — heterogeneous (
hero,richText,gallery,cta). - media — references to S3/Cloudinary assets with derived sizes.
- revisions — append-only history collection for undo/restore.
- menus / nav — tree of references, often denormalized for fast read.
- i18n via
localefield + per-locale slug index.
Informative example
Page with mixed-type blocks — natural document model:
{_id, slug: "/about", locale: "en", status: "published",seo: { title, description, ogImage },blocks: [{ type: "hero", headline: "Hello", media: { assetId, alt } },{ type: "richText", html: "<p>...</p>" },{ type: "gallery", items: [{ assetId, caption }, ...] },{ type: "cta", label: "Get started", href: "/signup" }],updatedAt, updatedBy, version: 12}
Real-world use
Forbes serves 100M+ monthly readers from a MongoDB-backed CMS. Payload CMS, Strapi, KeystoneJS, Hygraph and Sanity-on-Mongo all use this exact block-based document model.
Best practices
- Always carry a
versionfield for optimistic concurrency on the editor. - Store revisions in a separate collection — pages stay slim.
- Cache published pages aggressively (Redis / CDN) — the DB sees mostly editor traffic.
- Use
$jsonSchemavalidation so every block type has the right fields.