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

๐Ÿ” Is final Really Final in Java? The Truth May Surprise You ๐Ÿ˜ฒ

๐Ÿ’ฌ “When I was exploring what to do and what not to do in Java, one small keyword caught my eye — final . I thought it meant: locked, sealed, frozen — like my fridge when I forget to defrost it.”   But guess what? Java has its own meaning of final… and it’s not always what you expect! ๐Ÿ˜… Let’s break it down together — with code, questions, confusion, jokes, and everything in between. ๐ŸŽฏ The Confusing Case: You Said It's Final... Then It Changed?! ๐Ÿซ  final List<String> names = new ArrayList <>(); names.add( "Anand" ); names.add( "Rahul" ); System.out.println(names); // [Anand, Rahul] ๐Ÿคฏ Hold on... that’s final , right?! So how on earth is it still changing ? Time to dive deeper... ๐Ÿง  Why Is It Designed Like This? Here’s the key secret: In Java, final applies to the reference , not the object it points to . Let’s decode this like a spy mission ๐Ÿ•ต️‍♂️: Imagine This: final List<String> names = new ArrayList <>(); Be...

๐ŸŽข Java Loops: Fun, Fear, and ForEach() Fails

๐ŸŒ€ Oops, I Looped It Again! — The Ultimate Java Loop Guide You Won't Forget “I remember this question from one of my early interviews — I was just 2 years into Java and the interviewer asked, ‘Which loop do you prefer and why?’” At first, I thought, “Duh! for-each is cleaner.” But then he grilled me with cases where it fails. ๐Ÿ˜ต That led me to explore all loop types, their powers, and their pitfalls. Let’s deep-dive into every major Java loop with examples &  real-world guidance so you'll never forget again. ๐Ÿ” Loop Type #1: Classic For Loop — “The Old Reliable” ✅ When to Use: You need an index You want to iterate in reverse You want full control over loop mechanics ✅ Good Example: List<String> names = List.of("A", "B", "C"); for (int i = 0; i < names.size(); i++) { System.out.println(i + ": " + names.get(i)); } ๐Ÿ”ฅ Reverse + Removal Example: List<String> item...

๐Ÿงต 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 │ └────────────┬──────────────┘ │ ...