在mongo文档中创建自动增量字段

时间:2017-11-14 16:53:28

标签: java spring mongodb spring-boot spring-data-mongodb

在我的Spring Boot应用程序中,我使用的是Spring-Data MongoDB,我有一个代表用户的简单POJO:

@EqualsAndHashCode
public class User implements Storable {

  @Id
  public ObjectId id;

  @Getter @Setter public String firstName;
  @Getter @Setter public String lastName;
  @Getter @Setter public long userNum;
  @DBRef(lazy = true)
  @Getter @Setter public List<Section> sections = new ArrayList<Section>();

... 
rest of class omitted
...

}

我的UserController看起来像这样:

@Controller
public class UserController {

  @Autowired
  UserRepository repository;

  @ModelAttribute("allSections")
  public List<Section> getSections() {
    return sectionRepository.findAll();
  }

  @RequestMapping(value = "/users/new", method = RequestMethod.POST)
  public String newUser(@ModelAttribute("user") User user) {
    User newUser = new User();
    newUser.userNum = user.userNum;
    newUser.firstName = user.firstName;
    newUser.lastName = user.lastName;
    newUser.sections = user.sections;
    newUser = repository.save(newUser);

    for (Section section : newUser.sections) {
      section.addToUsers(newUser);
      sectionRepository.save(section);
    }

    return "redirect:/users";
  }
... rest of controller omitted 
}

请注意,我想要自动生成的字段不是ID字段。

我希望userNum属性自动递增,以便创建和存储在数据库中的第一个用户对象以某个值开始...比如说9000,之后创建的每个用户加1 。

我有什么选择呢?我看过使用JPA的@GeneratedValue的例子,其他依赖自定义Mongo查询来创建序列集合的例子,但是我还没有能够工作......

2 个答案:

答案 0 :(得分:1)

创建Counter集合:

import Text.Printf(printf)

concatMap (printf "%-4d") [1..n] ++ "\n"

然后是MongoRepository:

public class Counter {

    @Id
    private String id;

    private long seq;

    public Counter(String id, long seq) {
        this.id = id;
        this.seq = seq;
    }

    // Getters and setters
}

服务/ DAO:

@Repository
public interface CounterRepository extends MongoRepository<Counter, String> {}

答案 1 :(得分:1)

好的,我在这里想到了这就是我实现这个的方法:

userNum的类,这是一个简单的POJO

public class UserNum {

  @Id
  private ObjectId id;

  @Getter
  @Setter
  public long seq;

  public UserNum(long seq) {
    this.seq = seq;
  }

}

UserNumRepository定义了一个方法,该方法返回保存到集合的最后一个UserNum

@Repository
public interface UserNumRepository extends MongoRepository<UserNum, String> {
  UserNum findTopByOrderByIdDesc();
}

UserNumService,它只是查找序列中的最后一个数字并创建下一个数字,然后保存并返回该数字。 UserNumService是具有一个方法签名的接口。这将创建一个已创建和使用的所有userNum的集合。

@Service
public class UserNumServiceImpl implements UserNumService {

  @Autowired
  private UserNumRepository userNumRepository;

  @Override
  public long getNext() {
    UserNum last = userNumRepository.findTopByOrderByIdDesc();
    long lastNum = last.seq;
    UserNum next = new UserNum(lastNum + 1);
    userNumRepository.save(next);
    return next.seq;
  }
}

在Application.java中,您可以使用起始编号或mongo shell为集合添加种子。

@Autowired UserNumRepository userNumRepository;

public void run(String... args) throws Exception {

    userNumRepository.deleteAll();
    // start the sequence at 9000
    userNumRepository.save(new UserNum(9000)); 
}

最后,现在您可以在需要发布新的userNum时使用该服务,可能在构造函数中。