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 :)
Change return value only 1L in SequenceGeneratorService generateSequence method
Change sequence number in collection (I was using mongodb compass)