【问题标题】:How to Generate Sequence Number with MongoDB in Spring Boot?如何在 Spring Boot 中使用 MongoDB 生成序列号?
【发布时间】:2020-12-15 06:58:13
【问题描述】:

我正在做一个 Spring Boot 项目并决定使用 MongoDB。我只想在 MongoDB 中生成序列号。因此,即使有 100 多个不同的客户尝试这样做,我也不想与任何生成的数字发生冲突。有什么办法吗?

我也试着做这样的事情:

SequenceNumber sequenceNumber;

        String SEQUENCE_NAME = "example";

        sequenceNumber = mongoOperations.findAndModify(query(where("_id").is(SEQUENCE_NAME)),
                new Update().inc("number", 1), options().returnNew(true).upsert(true),
                SequenceNumber.class);
                
 return sequenceNumber.getNumber();

这样对吗?

感谢您的回答!

【问题讨论】:

    标签: java mongodb spring-boot nosql


    【解决方案1】:

    https://www.javaprogramto.com/2019/05/spring-boot-mongodb-auto-generated-field.html

    1. 首先,创建一个将自动递增值存储在其中的集合。这可以使用 mongo shell 或 MongoDB Compass 来创建
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Document(collection = "database_sequences")
    public class DatabaseSequence {
    
        @Id
        private String id;
    
        private long seq;
    
        public DatabaseSequence() {}
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public long getSeq() {
            return seq;
        }
    
        public void setSeq(long seq) {
            this.seq = seq;
        }
    }
    
    1. 然后让我们创建一个 users_db 集合。此集合存储正在使用的用户。
    import org.springframework.data.annotation.Id;
    import org.springframework.data.annotation.Transient;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Document(collection = "users_db")
    public class User {
    
        @Transient
        public static final String SEQUENCE_NAME = "users_sequence";
    
        @Id
        private long id;
    
        private String firstName;
    
        private String lastName;
    
        private String email;
    
        public User() { }
    
        public User(String firstName, String lastName, String email) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.email = email;
        }
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
        
        @Override
        public String toString() {
            return "User{" + "id=" + id + ", firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + '}';
        }
    

    【讨论】:

    • 我想为每个调用函数制作序列。例如,我从 A Service 调用 generateSequence() ,但同时另一个服务可以调用函数并且会出现性能问题。我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2020-12-11
    • 1970-01-01
    • 2019-02-27
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多