我有一个包含以下数据的集合:
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集合中找到一个业务的最大版本,然后在其中插入具有递增版本号和新更改的新文档。我不知道该怎么做一次查找和插入操作
答案 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 索引。
另一种方法是指定字段的期望当前值 在查询谓词中进行写操作。