更新MongoDb中对象的所有属性

Sef*_*efa 11 .net c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

我在我的项目中使用MongoDB .Net驱动程序.我想更新存储在MongoDB中的对象的所有属性.在文档中,更新显示如下:

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

await collection.UpdateOneAsync(filter, update);
Run Code Online (Sandbox Code Playgroud)

但我不想Set为所有属性调用该方法,因为有许多属性,将来可能会有更多属性.

如何使用MongoDB .Net驱动程序更新整个对象?

i3a*_*non 22

你可以用ReplaceOneAsync而不是UpdateOneAsync.

您需要一个过滤器来匹配现有文档(文档ID最简单的过滤器)和新对象.

Hamster hamster = ...
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster);
Run Code Online (Sandbox Code Playgroud)

  • 但这样的话,如果现有文档中缺少某个字段,它就会被删除,不是吗?重点是将未知数量的字段设置为新值,根据需要覆盖或添加,而不删除丢失的字段。 (3认同)
  • 但是,如何在不先向数据库发送已存在ID的附加请求的情况下为它们赋予相同的ID?我在这里想念什么吗? (2认同)

Beh*_*bdy 5

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);
Run Code Online (Sandbox Code Playgroud)

此代码使用反射将给定对象的所有属性包含
到更新语句中,无需手动添加所有属性,因为您看到 Id 已从更新语句中明确排除以避免异常。

  • @Steve - 好吧,那么你只需要在反射中进行一些递归。实际上,我认为这不是正确的方法。 (3认同)