Вот мой код:
Код: Выделить всё
public Task UpsertAsync(User user, CancellationToken cancellationToken) =>
context.Users.UpdateOneAsync(
Builders.Filter.Eq(u => u.Id, user.Id) &
Builders.Filter.Lt(u => u.Version, user.Version),
Builders.Update
.SetOnInsert(u => u.Id, user.Id)
.Set(u => u.IsDeleted, user.IsDeleted)
.Set(u => u.Version, user.Version)
.Set(u => u.Name, user.Name)
.Set(u => u.UserName, user.UserName)
.Set(u => u.Media, user.Media),
new UpdateOptions { IsUpsert = true },
cancellationToken
);
- Вставить документ, если он не существует
- Обновить его, только если входящая версия больше сохраненной
Когда документ уже существует с более высокой версией версия, фильтр не соответствует:
Код: Выделить всё
Id == user.Id AND Version < user.Version → false
Код: Выделить всё
DuplicateKeyException (same Id)
Каков рекомендуемый способ обработки этого сценария?
- Является ли перехват и игнорирование DuulateKeyException правильным/ожидаемым подходом в этом шаблоне?
- Или есть лучший способ реализовать «обновление только в том случае, если версия более новая, в противном случае ничего не делайте» без попытки вставки?
Буду признателен за любые рекомендации или рекомендации.