MongoDB с Spring Data, как условно отказаться? - PullRequest
1 голос
/ 22 февраля 2020

В настоящее время пытаюсь реализовать операцию обновления на MongoDB с данными Spring.

public class Student {

        @Indexed(unique = true)
        @NotNull
        private String studentId;
        private Long triggerTime;
        ...
}

Чего я на самом деле хочу достичь, так это условного роста . (обновить, если существует / создать, если не основано на studentId), пока triggerTime сохраняемого студента делает c старше.

Читайте о настройке WriteConcernResolver с WriteConcern.ACKNOWLEDGED следующим образом:

public WriteConcern resolve(MongoAction action) {
    if (action.getCollectionName().getClass().getSimpleName().contains("Student")) {
        return WriteConcern.ACKNOWLEDGED;
    }
    return action.getDefaultWriteConcern();
}

Но я не понимаю объект MongoAction и как его создать. Или я совершенно не на том пути?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Вы немного смущены.

Напишите, что это глобально высокоуровневая конфигурация соединения для определения уровня подтверждения, запрашиваемого у MongoDB для операций write, таких как insert, update, remove, et c ...

Другими словами, ваше приложение сообщает MongoDB минимальное подтверждение ( ACK ), ожидаемое от сервера.

https://docs.mongodb.com/manual/reference/write-concern/


upsert - это опция метода обновления MongoDB для создания нового документа, когда ни один документ не соответствует критериям запроса. По умолчанию false, поэтому, когда не найдено ни одного документа, условие обновления игнорируется. Если это true, он создаст новый документ с полями, определенными в параметрах query + update.

Посмотрите, как это работает:

//search a student
Query query = new Query();
query.addCriteria(Criteria.where("studentId").is("1"));

//update condition
Update update = new Update();
update.set("triggerTime", System.currentTimeMillis());

mongoOperation.upsert(query, update, Student.class);

Он попытается соответствует studentId. - Если найден, он обновит triggerTime с текущим временем. - Если файл не найден, он вставит новый документ с studentId:"1", triggerTime:current time, а другие поля будут null (если у класса Student больше полей).

К сожалению, нет условного обновления, выполняющего один запрос .

Вам нужно сделать это вручную: Поиск - Применить бизнес логи c - создать / сохранить / игнорировать

0 голосов
/ 22 февраля 2020

Я не уверен, что это помогает, но мне кажется, что запрос обновления Mon go (https://docs.mongodb.com/manual/reference/method/db.collection.update/) допускает параметр «query», который будет влиять на то, на какие данные он действует , Если вы напишите запрос, который семантически other.studentId NOT EXISTS OR (other.studentId EXISTS AND other.triggerTime < this.triggerTime), и передадите этот запрос в ваше действие Mon go upsert, это должно решить вашу проблему, верно?

...