我有两个集合:sights
和events
。它们看起来像这样:
//Sight document:
{
"_id" : ObjectId("5a14d93616016e2bb8796ccf"),
"RelatedEventsId" : [
ObjectId("5a14d93616016e2bb8796cd0"),
ObjectId("5a14d93616016e2bb8796cd1")
]
//other stuff
}
//Event document
{
"_id" : ObjectId("5a14d93616016e2bb8796cd0"),
"RelatedSightsId" : [
ObjectId("5a14d93616016e2bb8796ccf")
]
//other stuff
}
因此,视力和事件与多对多有关。我面临的问题是更新特定文档之间的关系。在方法EditSight
中,我想通过提供new-one来更新数据库中的视线。我找到idListToAdd
的{{1}}和idListToDelete
来添加新关系并删除集合RelatedEventsId
中的旧关系。
events
拉从var pull = Builders<Event>.Update.PullFilter(p => p.RelatedSightsId, f => f == oldSight.Id);
var push = Builders<Event>.Update.Push(p => p.RelatedSightsId, new ObjectId(id));
EventCol.UpdateMany<Event>(x => idListToDelete.Contains(x.Id), pull);
EventCol.UpdateMany<Event>(x => idListToAdd.Contains(x.Id), push);
SightCol.ReplaceOne(SBuilder.Eq(x => x.Id, new ObjectId(id)), newSight);
集合中删除event.RelatedSightsId
中的旧ID。
推送将新ID添加到event
集合中的event.RelatedSightsId
。
上面的代码也提供了异常:
event
另外,在批量写入中进行此更新会很好。
谢谢!
答案 0 :(得分:0)
PullFilter出现问题,所以我解决了这个问题:
List<Sight> sightsToPull = SightCol.Find(x => evnt.RelatedSightsId.Contains(x.Id)).ToList();
foreach (Sight e in sightsToPull)
{
foreach (var x in e.RelatedEventsId)
{
if (x == evnt.Id)
{
e.RelatedEventsId.Remove(x);
break;
}
}
SightCol.ReplaceOne(x => x.Id == e.Id, e);
}
Lame,但至少有效。