Spring Boot-Mongodb-基于另一个字段的自动递增字段

时间:2019-05-17 23:42:17

标签: java mongodb spring-boot

我有一个包含以下数据的集合:

id: 1, item: book, version: 1
id: 2, item: book, version: 2
id: 3, item: cat, version: 1
id: 4, item: cat, version: 2
id: 5, item: cat, version: 3

我想通过提及项目本身来插入一个新元素。该ID当然是自动生成的。应根据项目字段自动增加版本。这意味着,如果我想插入带有“ book”项的新文档,则其外观应为:

id: 6, item: book, version: 3

如何在MongoDB数据库中的Spring Boot中使用它。

情况: 实际上,我有两个集合:变更,状态。在服务器端应用程序中,我们有业务。我们在州集合中为每个企业都有一个州文件。业务中可能会有数据更改,当发生更改时,我们会从状态集合中获取业务状态。它包含一个businessID和一个版本。版本是企业的整体数据版本。我们将版本号加1,然后将其保存到州文档中。然后,我们将文档保存在变更集合中,该文档包含一个businessId,一个新版本以及有关实际变更的数据。 问题是这是数据库中的两个操作。如果业务发生了很多变化,则这两个集合中的数据可能会被破坏。计划是删除状态集合并仅保留更改集合。然后,我们必须对一个单一数据库操作执行以下操作:在changes集合中找到一个业务的最大版本,然后在其中插入具有递增版本号和新更改的新文档。我不知道该怎么做一次查找和插入操作

1 个答案:

答案 0 :(得分:0)

您可以使用另一个集合来保存ID序列。每当有人请求新的ID时,该方法都会确保它增加ID。

@Document
public class CollectionSeq {
    @Id
    @Indexed( unique = true)
    private String collection;
    private long current = 1;
}

您可以获得下一个ID:

public long next(String collection) {
        CollectionSeq next = operations.findAndModify(
                query(where("collection").is(collection)),
                new Update().inc("current", 1),
                options().returnNew(true).upsert(true),
                CollectionSeq.class
        );
        return Objects.requireNonNull(next).getCurrent();
} 

在保存集合的新文档之前,请分配ID。

Item item = new Item();
item.setId(collectionSeqRepository.next("item"));
item.setVersion(4);
...

itemRepository.save(item)

音序器集合如下:

collection: item, current: 3
collection: book, current: 100
collection: version, current: 4

根据官方文档,MongoDB确实提供了隔离的更新和返回。

这是MongoDB官方文档链接:为什么findAndModify is Atomic.

  

并发控制允许多个应用程序   并发运行而不会导致数据不一致或冲突。

     

一种方法是在只能包含以下内容的字段上创建唯一索引   独特的价值观。这样可以防止创建插入或更新   重复数据。在多个字段上创建唯一索引以强制   字段值组合的唯一性。作为使用示例   的情况,请参见update()和Unique Index以及findAndModify()和Unique   索引。

     

另一种方法是指定字段的期望当前值   在查询谓词中进行写操作。