MongoDB PullFilter和UpdateMany C#

时间:2017-11-22 02:51:26

标签: c# mongodb

我有两个集合:sightsevents。它们看起来像这样:

//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

另外,在批量写入中进行此更新会很好。

谢谢!

1 个答案:

答案 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,但至少有效。