Со следующей структурой документа
public class Disclaimer
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public ObjectId Id { get; set; }
public List<Override> Overrides { get; set; }
}
public class Override
{
public int CategoryId { get; set; }
public DateTime EffectiveDate { get; set; }
public DateTime? ExpiryDate { get; set; }
public string Message { get; set; }
}
И запросом
var idFilter = Builders<Models.Database.Disclaimer>.Filter.Where(x => x.Id == ObjectId.Parse(id) && x.Overrides.Any(y => y.CategoryId == createOverrideDto.CategoryId)));
var overrideCancellations = Builders<Models.Database.Disclaimer>.Update.Set(x => x.Overrides[-1].ExpiryDate, DateTime.Now);
var update = overrideCancellations.Push(x => x.Overrides, new Models.Database.Override()
{
CategoryId = createOverrideDto.CategoryId,
EffectiveDate = DateTime.Now,
Message = createOverrideDto.Message
});
result = _repository.Get().UpdateOne(filter, update);
Я хотел бы обновить существующие элементы переопределения с датой истечения срока действия, когда новый добавляется в тот же элементкатегории, и добавьте новый элемент.Если существуют элементы, не относящиеся к той же категории, их следует оставить в покое, просто добавьте новый элемент.
Мой текущий код работает нормально, если есть один или несколько существующих элементов Override с выбранной категорией.Однако, когда их нет, т. Е. Если массив пуст или все существующие не находятся в категории, предложение фильтра не совпадает, и обновление не выполняется.
Я пытался изменить свой фильтр, чтобы соответствовать, когдав этой категории нет переопределений.Однако затем все существующие элементы, не входящие в выбранную категорию, также обновляются, т. Е. Добавляется дата истечения срока действия.
Я мог бы изменить структуру своего документа так, чтобы переопределением был объект с полем идентификатора категории, а затем отдельные массивы, но яможет все еще иметь проблему upsert?