具有以下文档结构
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元素时将其过期日期更新,并添加新元素。如果存在不属于同一类别的现有元素,则应将其单独放置,仅应添加新元素。
如果选择的类别中存在一个或多个现有Override元素,则我的当前代码可以正常工作。但是,如果没有,即如果数组为空或所有现有数组都不在类别中,则filter子句不匹配,并且不运行更新。
我已尝试修改此过滤器以使其在此类别中没有替代项时匹配。但是,所有不在选定类别中的现有元素也会被更新,即添加了有效期。
我可以更改我的文档结构,以使Overrides是具有类别ID字段的对象,然后是单独的数组,但是我仍然可能遇到upsert问题?
您要执行的操作需要使用数组过滤器,并使用2个步骤进行批量更新。这是一个使用MongoDB.Entities