Skip to main content

πŸƒ MongoDB Magic — From Zero to Rock-Solid in Minutes! πŸš€

πŸš€ From Chaos to Order: How Mongock & Friends Keep Your DB in Shape Automatically!

☁️ The “Cloudyrock” Mystery

You might have seen this in a Spring Boot project:

@ChangeLog

public class DatabaseChangelog {

  

    @ChangeSet(order = "001", id = "createIndex", author = "anand")

    public void createIndex(MongoTemplate mongoTemplate) {

        mongoTemplate.indexOps("users")

                     .ensureIndex(new Index().on("email", Sort.Direction.ASC).unique());

    }

}

And wondered:

πŸ’­ "Wait… where’s my CREATE INDEX script? Who’s applying this? And why is it happening without me touching the DB?"

That’s Mongock in action — made by the Cloudyrock team.
It’s basically the database time machine for Java projects.
No flux capacitors, just clever scanning, execution, and bookkeeping.

πŸ” How It Works (From Start to End)

1️⃣ Scan Your Change Logs

You specify in application.properties:

mongock.change-logs-scan-package=com.javabeanbag.changelog

Mongock starts with Spring Boot and scans this package for classes annotated with @ChangeLog.

2️⃣ Run Only What’s New

Inside each @ChangeLog, you define @ChangeSet methods.

  • id → Unique name for the change
  • order → Execution order
  • author → Who wrote it

Mongock stores the executed changes in a special collection/table (e.g., mongockChangeLog in MongoDB).

Before running a change, it checks:
“Is this id already in my history table?
If yes → skip
If no → run and record it.”

This prevents duplicate execution and “index already exists” errors.

3️⃣ Apply Changes

  • For MongoDB → Uses MongoTemplate or MongoDatabase to run commands
  • For MySQL/PostgreSQL (JDBC mode) → Runs SQL via JDBC

✅ Yes — Mongock can work with MySQL, but for SQL databases, Liquibase/Flyway are more common.

πŸ“Œ Example — Adding an Index in MongoDB

@ChangeLog(order = "001")

public class UserIndexes {

    @ChangeSet(order = "001", id = "createEmailIndex", author = "anand")

    public void createEmailIndex(MongoTemplate mongoTemplate) {

        mongoTemplate.indexOps("users")

                     .ensureIndex(new Index().on("email", Sort.Direction.ASC).unique());

    }

}

πŸ“ What Happens in the DB

After the first startup, Mongock creates a special collection in MongoDB:

mongockChangeLog

{

  "_id": ObjectId("66bb98f4134a6e24f0e91234"),

  "changeId": "createEmailIndex",

  "author": "anand",

  "timestamp": ISODate("2025-08-13T10:20:00Z"),

  "state": "EXECUTED",

  "executionMillis": 120,

  "executionHostname": "dev-machine",

  "executionId": "f27b81f2-2341-4d8f-8d4b-23bb53f1c9ae"

}

πŸ“Œ Next Startup: Mongock checks changeId → “Already exists” → Skips execution.

πŸ’‘ Example — Seeding Initial Data in MySQL

@ChangeLog(order = "002")

public class InitialData {

    @ChangeSet(order = "001", id = "insertAdmin", author = "anand")

    public void insertAdmin(Connection connection) throws SQLException {

        try (PreparedStatement stmt = connection.prepareStatement(

             "INSERT INTO users (id, username, role) VALUES (1, 'admin', 'ADMIN')")) {

            stmt.executeUpdate();

        }

    }

}

⚔️ Mongock vs Liquibase vs Flyway — Quick Battle Card

FeatureMongockLiquibaseFlyway
MongoDB Support✅ Native❌❌
MySQL/Postgres✅ (JDBC)✅✅
Java Code Changes✅❌ (SQL/XML)❌ (SQL only)
Microservices Ready✅✅✅
Best ForMixed NoSQL+SQLComplex DBSimple SQL

πŸ˜‚ Life Without Mongock

  • 🧠 Remembering which DB got which index
  • πŸ–Š Writing “DB update” docs nobody reads
  • πŸƒ‍♂️ Running manual scripts at midnight before deployment
  • πŸ› Accidentally applying the same change twice

☕ Life With Mongock: Drink coffee → Deploy → Mongock: “Relax, I got this.”

πŸ”„ Wrapping Up ☕

When working in microservices, keeping DB schemas in sync is like keeping cats in a bathtub — chaos πŸ±πŸ’¦.

Mongock (or Liquibase/Flyway) brings order:

  • Tracks applied changes
  • Avoids duplicates
  • Works across environments without manual steps
πŸ’‘ Rule:
MongoDB → Go Mongock
Pure SQL → Use Liquibase or Flyway

Comments

Popular posts from this blog

🐱 Tomcat vs ⚡ Netty – Which One Should You Use?

🐱 Tomcat vs ⚡ Netty – Which One Should You Use? So recently I got curious about this too πŸ€”. Everywhere in Spring Boot tutorials we see Tomcat . Then suddenly while exploring Spring WebFlux , the name Netty pops up. And I was like – “Wait, who’s this Netty guy trying to replace Tomcat?” πŸ˜… Let’s break it down with real-time examples , icons , and fun comparisons . 🐱 Tomcat – The Traditional Web Server Type: Servlet Container (blocking I/O) World: Used with Spring MVC Style: Thread-per-request model πŸ‘©‍πŸ’» Pros: Stable, widely used, battle-tested Cons: Struggles with huge concurrent connections πŸ‘‰ Example in real life: Tomcat is like a restaurant with fixed waiters 🍴. - Each customer = one thread/waiter - If too many customers come in at once → waiters run out → customers wait outside πŸšͺ ⚡ Netty – The Reactive Rockstar Type: Asynchronous Event-Driven Network Framework World: Default for Spring WebFlux Style: Event-lo...

🎭 Spring’s Secret: Why @Transactional & Friends Betray You Silently

πŸ’‘ Lesson Learned — Not a Prod Bug, But a Real Pain No, this wasn’t a production outage. Nobody screamed at me. But I sat for 3 hours wondering: “Why the heck is my @Transactional not rolling back!?” 😡‍πŸ’« “Why is Redis cache not working?” 🀯 Turned out, the issue was one silent villain: 🧱 Self-invocation 🀷 What Is @Transactional ? If you're new: @Transactional = Tells Spring to start a DB transaction when a method is called. It’ll commit if everything’s okay. It’ll rollback if something fails. 🧠 Think of it like wrapping your code in: try { beginTransaction(); // your logic commit(); } catch(Exception e) { rollback(); } πŸ•΅️ Real-Life Analogy — The Gateway Community 🏘️ Let me tell you about my society — it has a strict watchman at the gate. Here’s how it works: πŸ›‚ Watchman = Spring Proxy 🏠 Your apartment = Your service class πŸšͺ Your room = A method inside that class πŸƒ Scenario 1: Outsider Visits Your friend from outside...

🧡 Virtual Threads in Java — The Ultimate Guide with Diagrams, Code & Interview Qs!

πŸš€ “How are Virtual Threads different from Thread Pools?” 😡 “Are they OS threads or JVM threads?” πŸ™ƒ “Should I still use CompletableFuture?” 🀯 “How do I even use them in real-time microservices?” 🧠 What are Virtual Threads? Virtual Threads (introduced in Java 21 as stable πŸŽ‰) are lightweight threads managed by the JVM instead of the OS kernel. πŸ‘‰ They look like normal threads, but don’t hog OS resources like traditional threads. 🧠 What is the OS Kernel? πŸ›️ OS Kernel = The Brain of the Operating System It’s the core part of your OS (Windows, Linux, Mac) that: Manages memory 🧠 Schedules threads πŸ•’ Talks to hardware πŸ’» Handles I/O operations πŸ“¨ When you create a traditional thread in Java, the JVM asks the OS Kernel to create a real OS-level thread. πŸ–Ό️ Imagine This... ┌───────────────────────────┐ │ Your Java Application │ └────────────┬──────────────┘ │ ...