2017-09-07 8 views
1

私はタイプUserのPOCOをいくつか持っていますが、今後そのプロパティが変更される懸念があります。私はUsersとデータを格納するmongodbを持っています。一意性の制約はありません。不幸にもそれを作成することはできません。私のアプリはサードパーティのアーカイブソースから古いユーザをインポートしています。これらのユーザをmongoに書きたいのですが、重複したくないので、mongoのデータ実際のものです。基本的には、a.Username == b.Username && a.Email == b.Emailなどのフィルタを照合してユーザーの重複を定義することはできますが、この質問には関係したくありません。ユーザーAとBが同じかどうかを判断できる方法があるとしましょう。MongoDB C#ドライバ:存在しない場合は文書を作成

ここで私の唯一のオプションは、SetOnInsertでupsert Updateを使用しているようです。 C#ドライバにはメソッドBuilders<User>.Update.SetOnInsert<TField>(Expression<User,TField>, TField)がありますが、それを複数回呼び出すとすべてのプロパティが列挙されます。これらのプロパティが将来変更される場合、誰かがこのメソッドを更新する必要があり、私はそれを気に入らない。

この問題を回避する方法はありますか?たぶんreflecionとPropertyInfoを使用するか、またはBsonDocumentと直接作業していますか?それとももっと簡単な方法がありますか?前もって感謝します。

答えて

1

[OK]を、ので、それはすべての後に、そのハードではなかった。

var updates = new List<WriteModel<User>>(); 
    foreach (User appUser in users) 
    { 
     FilterDefinition<User> filter = Builders<User>.Filter.Eq(x => x.Username, appUser.Username) & ... 

     var bsonDoc = appUser.ToBsonDocument(); 
     UpdateDefinition<User> updateDefinition = new UpdateDefinitionBuilder<User>().Unset("______"); // HACK: I found no other way to create an empty update definition 
     foreach (var element in bsonDoc.Elements) 
     { 
      if (element.Name == "_id" || element.Value == BsonNull.Value) 
       continue; 
      updateDefinition = updateDefinition.SetOnInsert(element.Name, element.Value); 
     } 
     UpdateOneModel<User> update = new UpdateOneModel<User>(filter, updateDefinition) { IsUpsert = true }; 
     updates.Add(update); 
    } 
    MongoConnectionHelper.Database.GetCollection<User>("Users").BulkWrite(updates); 
関連する問題