我正在围绕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;}
}
那么我该如何解决这个问题,例如,不使用反射来遍历属性呢?
答案 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方法。