2017-09-07 3 views
1

Ich habe einige POCO eines Typs User und ich habe einige Bedenken, die sich in Zukunft ändern werden. Ich habe einen Mongodb mit Users Sammlung, um die Daten zu speichern. Es gibt keine Einschränkung der Eindeutigkeit, und ich kann leider keine erstellen. Meine App importiert eine Menge alter Benutzer aus der Archivquelle von Drittanbietern und möchte diese Benutzer in Mongo schreiben können, aber ich möchte die Duplikate nicht, und ich möchte keine Benutzerdaten bei Übereinstimmung ersetzen, weil Daten in Mongo sind ist tatsächlich. Im Grunde können wir Benutzerduplikate definieren, indem wir Filter wie a.Username == b.Username && a.Email == b.Email oder etwas Ähnliches vergleichen. Ich möchte nicht, dass es für diese Frage relevant ist. Sagen wir einfach, dass wir erkennen können, ob Benutzer A und B gleich sind.MongoDB C# -Treiber: Dokument erstellen, wenn es nicht existiert

So scheint es, als wäre meine einzige Option hier upsert Update mit SetOnInsert zu verwenden. In C# -Treiber gibt es eine Methode Builders<User>.Update.SetOnInsert<TField>(Expression<User,TField>, TField), aber ich muss es mehrmals aufrufen, um alle Eigenschaften aufzuzählen. Wenn sich diese Eigenschaften in Zukunft ändern, muss jemand diese Methode aktualisieren und ich mag sie nicht.

Gibt es eine Möglichkeit, dieses Problem zu umgehen? Vielleicht mit reflecion und PropertyInfo oder mit BsonDocument direkt arbeiten? Oder vielleicht fehlt mir etwas und es gibt einen einfacheren Weg, es zu tun? Danke im Voraus.

Antwort

1

Ok, so war es nicht so schwer, nachdem alle:

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); 
Verwandte Themen