Spring Boot - Mongodb - Автоматически увеличенное поле на основе другого поля - PullRequest
0 голосов
/ 18 мая 2019

У меня есть коллекция со следующими данными:

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: 6, item: book, version: 3

Как это возможно при использовании Spring Boot в базе данных MongoDB.

Положение: На самом деле у меня есть две коллекции: изменения, состояния. В приложении на стороне сервера у нас есть бизнес. У нас есть государственный документ в коллекции штатов для каждого бизнеса. В бизнесе могут быть изменения данных, когда изменение происходит, мы получаем состояние бизнеса из коллекции состояний. Он содержит businessID и версию. Версия представляет собой общую версию данных бизнеса. Мы увеличиваем номер версии на единицу и сохраняем его в документе состояний. Затем мы сохраняем документ в коллекции изменений, который содержит данные о новой версии и данные о фактических изменениях. Проблема в том, что это две операции в базе данных. Если с бизнесом происходит много изменений, данные в этих двух коллекциях могут быть повреждены. План состоит в том, чтобы удалить коллекцию состояний и сохранить только коллекцию изменений. Затем мы должны сделать следующее с помощью одной операции с данными: найти самую большую версию одной компании в коллекции изменений, затем вставить туда новый документ с увеличенным номером версии и новым изменением. Я не знаю, как я могу сделать операции поиска и вставки

1 Ответ

0 голосов
/ 18 мая 2019

Вы можете использовать другую коллекцию для сохранения последовательности идентификаторов.Каждый раз, когда кто-то запрашивает новый идентификатор, метод гарантирует, что он увеличивает идентификатор.

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

Вы можете получить следующий идентификатор:

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();
} 

И прежде, чем сохранить новый документколлекции присваивают идентификатор.

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 является атомарным.

Управление параллелизмом позволяет одновременно запускать несколько приложений, не вызывая несогласованности данных или конфликтов.

Один из подходов заключается в создании уникального индекса для поля, которое может иметь только уникальные значения.Это не позволяет вставкам или обновлениям создавать дубликаты данных.Создайте уникальный индекс для нескольких полей, чтобы обеспечить уникальность этой комбинации значений полей.Примеры примеров использования см. В разделах update () и Unique Index, а также findAndModify () и Unique Index.

Другой подход заключается в указании ожидаемого текущего значения поля в предикате запроса для операций записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...