更新所有传入对象的字段,而无需使用替换

时间:2019-05-06 08:25:44

标签: c# mongodb .net-core mongodb-.net-driver

我正在围绕mongodb的某些功能编写包装器,以实施某些商务政策(例如,具有最后修改日期,文档版本&c)。这些额外的字段将不会出现在模型中,并且对于使用此库的实施人员而言是无关紧要的和透明的。该库将是通用的。

因此不可能使用replaceOne

我想要通过某种方式将一个人传递的对象中的所有字段传递给“更新”构建器-因此我可以相应地使用.Set / .Inc来添加其他字段。

下面是一个演示我想要的示例:

public static async Task UpdatePerson(string name, Person person)
    {
        var client = new MongoClient("mongodb://localhost:27017");
        IMongoDatabase db = client.GetDatabase("test");

        IMongoCollection<Person> collection = db.GetCollection<Person>("people");

        var query = Builders<Person>.Filter
        .Eq("name", name);

        var update = Builders<Person>.Update
        //Something here - how do I pass my person's properties?
        .Set("lastModified", DateTime.Now)
        .Inc("version",1);

        await collection.UpdateOneAsync(query, update );
    }

//--

//In real life this'll work for other types, this is for demonstration only
public class Person
    {
        public string name {get;set;}
        public string surname {get;set;}
}

那么我该如何解决这个问题,例如,不使用反射来遍历属性呢?

1 个答案:

答案 0 :(得分:2)

不确定是否能够执行此操作,但是Mongodb驱动程序提供了称为[BsonExtraElements]的东西。

public class Person
{
    public string name {get;set;}
    public string surname {get;set;}
    [BsonExtraElements]
    public Dictionary<string,object> AdditionalFields { get; set; }
}

将发生的事情是,无论类型如何,都无法将序列化到模型的所有内容填充到该字典中。您也可以添加和删除它。

这将不会增加数据库的额外开销。唯一的缺点是查询此字典并不是一个很好的经验,因为您可能需要将特定的键强制转换为它们的相关预期类型。

如果这不可行,我建议西蒙推荐的BSON方法。