c# - 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);
}
解决方案
推荐阅读
- python - 为什么我应该将函数列表参数设置为空或无,而不是使用普通变量
- python - 在tkinter的treeview中的for循环中的每个父节点下添加子节点
- html - Bootstrap 导航栏下拉子菜单在折叠模式下不起作用
- sql-server - TSQL:按一列分组,计算所有行并根据row_number保留第二列的值
- powershell - Jenkins Pipeline Job 打印两次 PowerShell 的输出
- javascript - (:visible) 选择器在 jQuery + Jest 中不起作用
- git - 在 psexec 模式下无法从 git 中提取
- javascript - 如何在前一个函数内部的另一个函数中使用一个函数的输入?
- java - 尝试创建 ODI Partial Tag VCS 时出现“java.lang.ArrayIndexOutOfBoundsException: 2”
- r - R data.table 的 fread() 在每次读取尝试时将引号内的字符串加倍