Позволяет атомарно создать запись с заданным уникальным ключом либо изменить её, если запись с таким значением ключа уже существует. Общую логику можно описать так:
Если в таблице нет ни одной записи с заданным значением ключа - создаётся новая запись с заданными значенями полей и заполнением значений полей по умолчанию (как в create).
Если в таблице присутствует запись с заданным значением ключа и она единственная - значения полей этой записи обновляются в соответствие с переданным объектом (как в update).
Если в таблице присутствует несколько записей с заданным значением ключа - бросается соответствующая ошибка, изменений не происходит. Значения переданных полей валидируются на сооветствие схеме таблицы.
Значения переданных полей валидируются на сооветствие схеме таблицы.
Использование метода
createOrUpdateBy
гарантирует, что в таблице не будет создано дублирующих записей по выбранному ключу. Однако, следует понимать, что гарантия действует только в случае, если для создания записей этой таблицы используется толькоcreateOrUpdateBy
и никогда не используется create.
table.createOrUpdateBy(ctx, uniqFieldName, fields)
app.Ctx
string
{ [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