gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:32:15 27 4
gpt4 key购买 nike

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

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。

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

最佳答案

您可以使用另一个集合来保存 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.

Concurrency control allows multiple applications to run concurrently without causing data inconsistency or conflicts.

One approach is to create a unique index on a field that can only have unique values. This prevents insertions or updates from creating duplicate data. Create a unique index on multiple fields to force uniqueness on that combination of field values. For examples of use cases, see update() and Unique Index and findAndModify() and Unique Index.

Another approach is to specify the expected current value of a field in the query predicate for the write operations.

关于java - Spring Boot - Mongodb - 基于另一个字段自动递增字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com