2017-11-22 10 views
0

2つのコレクション:sightseventsがあります。それらは次のようになります。MongoDB PullFilterとUpdateMany C#

//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でデータベースの視力を更新したいと思います。私はidListToAddidListToDeleteRelatedEventsIdであることを発見しました。新しい関係を追加し、古いものをコレクション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コレクションからevent.RelatedSightsIdに古いのIdsを削除します。

プッシュは、にeventコレクションに新しいIDを追加します。

また、上記のコードは、例外を与える:大量の書き込みでこのアップデートを行うにはいいだろう

System.InvalidOperationException: {document} is not supported. 

またなどの追加。

ありがとうございます!

答えて

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); 
} 

ラメが、少なくとも動作します。

関連する問題