首页 > 解决方案 > MongoDB 使用 C# 驱动程序更新嵌套数组

问题描述

我的类结构如下:

public class TodayEvent
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public DateTime TimeStamp { get; set; }
    public DateTime EndDate { get; set; }
    public DateTime StartDate { get; set; }
    public List<Event> Events { get; set; }
}
public class Event
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public int TodayEventId { get; set; }
    public string Name { get; set; }
}

我正在尝试以下方法来更新Event对象:

public async Task AddorUpdateTodayEvent()
{
    var todayDate = _dateService.Today;

    TodayEvent todayAllEventDb = (await SearchFor(b => b.TimeStamp >= todayDate)).FirstOrDefault();

    if (todayAllEventDb == null)
        return;

    List<Event> eventsDb = todayAllEventDb.Events.ToList();

    foreach (var res in await GetUpdatedEvent(eventsDb))
    {
       var eventObj = eventsDb.Where(x => x.Uid == res.UID).FirstOrDefault();

       //map to entity from dto objects using automapper
       var updatedMaped = _mapper.Map<EventDTO, Event>(res, eventObj);

       _eventRepository.Update(updatedMaped);
    }
}

方法的实现Update

public virtual void Update(TEntity obj)
{
    DbSet.ReplaceOneAsync(Builders<TEntity>.Filter.Eq("_id", obj.GetId()), obj);
}

实施DbSet

DbSet = Context.GetCollection<TEntity>(typeof(TEntity).Name);

我想更新Event对象,但尝试过_eventRepository.Update(updatedMaped);但没有用。我尝试使用以下代码查找该值,但该值为null

var value = DbSet.FindAsync(Builders<TEntity>.Filter.Eq("_id", obj.GetId()))

如何更新唯一的单个嵌套文档对象updatedMaped

编辑:我还尝试使用以下方式进行更新:但它将新行添加到嵌套属性而不是更新。

var update = Builders<TodayEvent>.Update.Push("Event", updatedMaped);
await UpdateOneAsync(x => x.Id == todayAllEventDb.Id, update);

UpdateOneAsync 的实现:

public async Task UpdateOneAsync(Expression<Func<TEntity, bool>> filter, UpdateDefinition<TEntity> entity)
{
    await DbSet.UpdateOneAsync(Builders<TEntity>.Filter.Where(filter), entity);
}

标签: c#mongodb.net-core

解决方案


推荐阅读