HeapTableRepo.createOrUpdateBy
Позволяет атомарно создать запись с заданным уникальным ключом либо изменить её, если запись с таким значением ключа уже существует. Общую логику можно описать так:
-
Если в таблице нет ни одной записи с заданным значением ключа - создаётся новая запись с заданными значенями полей и заполнением значений полей по умолчанию (как в create).
-
Если в таблице присутствует запись с заданным значением ключа и она единственная - значения полей этой записи обновляются в соответствие с переданным объектом (как в update).
-
Если в таблице присутствует несколько записей с заданным значением ключа - бросается соответствующая ошибка, изменений не происходит.
Значения переданных полей валидируются на сооветствие схеме таблицы.
Значения переданных полей валидируются на сооветствие схеме таблицы.
Использование метода
createOrUpdateByгарантирует, что в таблице не будет создано дублирующих записей по выбранному ключу. Однако, следует понимать, что гарантия действует только в случае, если для создания записей этой таблицы используется толькоcreateOrUpdateByи никогда не используется create.
Применение/сигнатура
table.createOrUpdateBy(ctx, uniqFieldName, fields)
Аргументы
- ctx*:
app.Ctx
Контекст запроса. Используется для внутренней реализации, сохранении информации о пользователе, изменившем запись, а также позволяет выполнить запрос в нужной транзакции. - uniqFieldName:
string
Название поля верхнего уровня из схемы таблицы, значение которого используется в качестве уникального ключа для данной операции. Поле должно иметь тип, поддерживающий фильтрацию по точному значению (см. руководство по языку запросов). - fields:
{ [uniqFieldName], ... }
Объект с полями и из значениями, соответствующими схеме таблицы.
В объекте должно быть определено значение поля,соответствующего uniqFieldName —, а также все "обязательные" поля, объявленные в схеме heap-таблицы: все кроме Optional, Nullable и NonRequired, как и в create.
Возвращаемое значение: Promise<HeapObject>
Только что созданный либо изменённый heap-объект.
Примеры
Создание уникальной записи с допольнительной информацией по текущему пользователю. В обоих вызовах createOrUpdateBy происходит работа с одной и той же записью.
const UserInfos = Heap.Table('userInfos', {
userId: Heap.RefLink('users'),
occupation: Heap.Optional(Heap.String()),
religion: Heap.Optional(Heap.String()),
})
const info1 = await UserInfos.createOrUpdateBy(ctx, 'userId', {
userId: ctx.user.id,
occupation: 'Software Developer',
})
const info2 = await UserInfos.createOrUpdateBy(ctx, 'userId', {
userId: ctx.user.id,
religion: 'Agnostic',
})
// info1.id === info2.id
