Search code examples
spring-data-mongodb

how to Initialization sequence generator _id in spring data mongo


i'm using spring boot + spring data mongodb and set Auto Generator Service ...

import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Getter
@Setter
@Document(collection = "auto_sequence")
public class AutoIncrementSequence {

@Id
private String id;
private Long seq;
}

and

package com.juhyun.shorturl.entity.sequence;

import lombok.RequiredArgsConstructor;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Objects;

import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;

@RequiredArgsConstructor
@Service
public class SequenceGeneratorService {

    private final MongoOperations mongoOperations;

    public Long generateSequence(String key) {
    AutoIncrementSequence counter = mongoOperations.findAndModify(Query.query(where("_id").is(key)),
            new Update().inc("seq", 1), options().returnNew(true).upsert(true), AutoIncrementSequence.class);

    //return BigInteger.valueOf(!Objects.isNull(counter) ? counter.getSeq() : 1);
    return !Objects.isNull(counter) ? counter.getSeq() : 1;
    }

}

Entity

public class ShortUrl {

@Transient
public static final String SEQUENCE_NAME = "shorturl_sequence";

@Id
private Long _id;

If the return value of the generateSequence method of class SequenceGeneratorService is changed to 1L, it will be solved, but I wonder if there is any other way. Thank you :)


Solution

    1. Change return value only 1L in SequenceGeneratorService generateSequence method

    2. Change sequence number in collection (I was using mongodb compass)