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...

๐ŸŒŸ My Journey – From Zero to Senior Java Tech Lead ๐ŸŒŸ

 There’s one thing I truly believe… If I can become a Java developer, then anyone in the world can. ๐Ÿ’ฏ Sounds crazy? Let me take you back. ๐Ÿ•“ Back in 2015… I had zero coding knowledge . Not just that — I had no interest in coding either. But life has its own plans. In 2016, I got a chance to move to Bangalore and joined a Java course at a training center. That’s where it all started — Every day, every session made me feel like: "Ohhh! Even I can be a developer!" That course didn’t just teach Java — it gave me confidence . ๐Ÿงช Two Life-Changing Incidents 1️⃣ The Interview That Wasn't Planned Halfway through my course, I had to urgently travel to Chennai to donate blood to a family member. After that emotional rollercoaster, I found myself reflecting on my skills and the future. The next day, as I was preparing for my move to Bangalore to complete the remaining four months of my course, I randomly thought — "Let me test my skills... let me just see...

๐ŸŽข 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...