C# 如何使用.NET MongoDB驱动程序的updateOne()更新但不替换文档 情况:
我在MongoDB中有一个现有的文档集合,我想用传入文档的字段更新特定文档的字段。 传入文档与集合中的文档具有相同的类,但未设置其所有字段,即某些字段为空。 现在,我不想替换集合中的整个文档,也不想替换所有字段,但我只想替换那些不为null的字段,并保持其余字段不变 描述如何替换整个文档。我用这个代码得到了这个:C# 如何使用.NET MongoDB驱动程序的updateOne()更新但不替换文档 情况:,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我在MongoDB中有一个现有的文档集合,我想用传入文档的字段更新特定文档的字段。 传入文档与集合中的文档具有相同的类,但未设置其所有字段,即某些字段为空。 现在,我不想替换集合中的整个文档,也不想替换所有字段,但我只想替换那些不为null的字段,并保持其余字段不变 描述如何替换整个文档。我用这个代码得到了这个: public void Update(string id, MyDoc docIn) => _docs.ReplaceOne(doc => scan.Id.Equals(
public void Update(string id, MyDoc docIn) => _docs.ReplaceOne(doc => scan.Id.Equals(ObjectId.Parse(id)), docIn);
为了更新文档中的各个字段
我的问题:
这是否意味着我必须编写自己的函数,将传入的文档转换为这样的“Update Operator Expressions文档”,还是有更方便的方法?正如您所说,使用Update Operator是一种方法。
其思想是使用过滤器,并使用穿过属性的对象的反射 您可以根据需要修改更新和筛选功能
using System.Reflection;
public void Update(string id, MyDoc docIn)
=> _docs.UpdateOne(doc => doc.Id.Equals(ObjectId.Parse(id)), UpdateDocument(docIn);
public UpdateDefinition<myDoc> UpdateDocument(myDoc docIn)
{
var builder = Builders<MyDoc>.Update.Set(u => u.Id, docIn.Id);
foreach(PropertyInfo prop in docIn.GetType().GetProperties())
{
var value = docIn.GetType().GetProperty(prop.Name).GetValue(docIn,null);
if ((prop.Name != "Id") & (value != null))
{
builder = builder.Set(prop.Name, value);
}
}
return builder;
}
使用系统反射;
公共作废更新(字符串id,MyDoc docIn)
=>_docs.UpdateOne(doc=>doc.Id.Equals(ObjectId.Parse(Id)),UpdateDocument(docIn);
公共更新定义更新文档(myDoc docIn)
{
var builder=Builders.Update.Set(u=>u.Id,docIn.Id);
foreach(docIn.GetType().GetProperties()中的PropertyInfo属性)
{
var value=docIn.GetType().GetProperty(prop.Name).GetValue(docIn,null);
如果((prop.Name!=“Id”)&(value!=null))
{
builder=builder.Set(prop.Name,value);
}
}
返回生成器;
}