Обновить все свойства объекта в MongoDb

Я использую драйвер MongoDB .Net в моем проекте. Я хочу обновить все свойства моего объекта, который хранится в MongoDB. В документации обновление показано так:

var filter = Builders<BsonDocument>.Filter.Eq("i", 10);
var update = Builders<BsonDocument>.Update.Set("i", 110);

await collection.UpdateOneAsync(filter, update);

Но я не хочу называть Set Метод для всех свойств, так как есть много свойств и может быть много в будущем.

Как я могу обновить весь объект, используя драйвер MongoDB .Net?

2 ответа

Решение

Вы можете сделать это с ReplaceOneAsync вместо UpdateOneAsync,

Вам нужен фильтр, чтобы соответствовать существующему документу (фильтр с идентификатором документа является самым простым) и новому объекту.

Hamster hamster = ...
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster);
var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null)))));
var options = new UpdateOptions();
collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options);

этот код использует отражение, чтобы включить все свойства данного объекта
к оператору обновления не нужно вручную добавлять все свойства, поскольку вы видите, что идентификатор явно исключен из оператора обновления, чтобы избежать исключения.

Если вы хотите обновить весь свой BsonDocument, существует неявное преобразование из BsonDocument в UpdateDefinition.

https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/UpdateDefinition.cs

var doc = new BsonDocument() { .... }
UpdateDefinition<BsonDocument> update = doc;
Другие вопросы по тегам