Загрузите полный документ (замените все, если «Id» существует // вставьте, если «Id» не существует) с C# Driver (MongoDB) - PullRequest
0 голосов
/ 29 марта 2020

Я изо всех сил пытаюсь сделать Upsert в MongoDB. Я хотел бы выполнить sh такое поведение:

Создать объект для загрузки в базу данных (NachName = LastName // VorName = FirstName): определение класса

public class NameModel
{
    [BsonId]
    public Guid Id { get; set; }
    public string  NachName { get; set; }
    public string VorName { get; set; }
    public NameModel() 
    {
        NachName = "Mustermann";
        VorName = "Max";
    }

    public NameModel(string nachName, string vorName)
    {
        NachName = nachName;
        VorName = vorName;
    }
}

Посмотрите, если База данных уже имеет запись (документ) с заданным Guid (Filter = Guid). Вызов метода:

NameModel name = new NameModel();
DB.UpsertDocumentByGuid<NameModel>("NameCollection", TxbGuid.Text, name);

И это метод, который вызывается, и вот ошибка

        public void UpsertDocumentByGuid<T>(string table, string guid, T document)
    {
        var collection = db.GetCollection<T>(table);
        var filter = new BsonDocument("Id", guid);
        var update = document ;  //   ERROR    -> converting T to MongoDB.Driver.UpdateDefinition<T> not possible

        var options = new UpdateOptions { IsUpsert = true }; 

        var result = collection.UpdateOne(filter, update, options);
    }

Я хотел бы иметь метод, который смотрит, если Guid уже там и если да, обновите то, что отличается в Документе (сравните документ, данный для Метода, с документом с найденным Guid) или, если существует объект Guid, вставьте новый документ в Базу данных.

1 Ответ

0 голосов
/ 02 апреля 2020

В идеале вы должны просто позвонить Builders<YourClass>.Update.Set() для каждого свойства, которое вы хотите установить. Однако, увидев, что вы сделали его обобщенным c, которого я лично постарался бы избежать, вы можете сделать это, создав собственный BsonDocument, представляющий операцию обновления:

public static async Task UpsertDocumentByGuid<T>(string table, string guid, T document)
{
    var client = new MongoClient();
    var database = client.GetDatabase("test");
    var collection = database.GetCollection<T>(table);
    var filter = new BsonDocument("Id", guid);

    var bsonDocument = document.ToBsonDocument();
    bsonDocument.Remove("_id");
    var update = new BsonDocument()
    {
        {"$set", bsonDocument}
    };

    var options = new UpdateOptions { IsUpsert = true };

    var result = await collection.UpdateOneAsync(filter, update, options);
}
...