C#MongoDb有条件地更新文档中的现有数组元素并添加新元素

问题描述 投票:1回答:1

具有以下文档结构

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问题?

c# arrays mongodb upsert
1个回答
0
投票

您要执行的操作需要使用数组过滤器,并使用2个步骤进行批量更新。这是一个使用MongoDB.Entities

© www.soinside.com 2019 - 2024. All rights reserved.