0

I have a collection migrationTest in MongoDB with a unique index for the message field. In my migration I'm inserting documents to this collection and in one place I'm using the existing message to simulate error. The Exception is thrown on migration as expected, but rollback() method is not executed and first two documents are persisted. What I'm doing wrong here?

This is a SpringBoot application with reactive MongoDB and for mongock I'm using

  • io.mongock:mongock-springboot:5.5.1
  • io.mongock:mongodb-reactive-driver:5.5.1

The FirstMigration class:

import com.mongodb.client.result.DeleteResult
import io.mongock.api.annotations.ChangeUnit
import io.mongock.api.annotations.Execution
import io.mongock.api.annotations.RollbackExecution
import io.mongock.driver.mongodb.reactive.util.MongoSubscriberSync
import org.bson.Document
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.data.mongodb.core.ReactiveMongoTemplate
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
import reactor.core.publisher.Flux
import java.time.Instant

@ChangeUnit(id = "migration-test", order = "202410291559")
class FirstMigration(private val mongoTemplate: ReactiveMongoTemplate) {

    val logger: Logger = LoggerFactory.getLogger(javaClass)
    val collectionName = "migrationTest"
    val message = "Test"

    @Execution
    fun execute() {
        logger.info("Creating test documents...")

        val subscriber = MongoSubscriberSync<Document>()
        Flux.fromIterable(listOf(1, 2, 1, 3, 4))
            .concatMap { i ->
                val doc = Document(mapOf("message" to "$message $i", "timestamp" to Instant.now()))
                mongoTemplate.insert(doc, collectionName)
            }.subscribe(subscriber)

        subscriber.await()
    }

    @RollbackExecution
    fun rollback() {
        logger.info("Removing test documents...")

        val subscriber = MongoSubscriberSync<DeleteResult>()
        val query = Query(Criteria.where("message").regex("^${message}"))
        mongoTemplate.remove(query, collectionName).subscribe(subscriber)

        val result = subscriber.getFirst()
        logger.info("Documents removed [ count: {}, wasAcknowledged: {} ]", result.deletedCount, result.wasAcknowledged())
    }
}

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.