C# 如何使用.NET MongoDB驱动程序的updateOne()更新但不替换文档 情况:

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(

我在MongoDB中有一个现有的文档集合,我想用传入文档的字段更新特定文档的字段。 传入文档与集合中的文档具有相同的类,但未设置其所有字段,即某些字段为空。 现在,我不想替换集合中的整个文档,也不想替换所有字段,但我只想替换那些不为null的字段,并保持其余字段不变

描述如何替换整个文档。我用这个代码得到了这个:

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);
}
}
返回生成器;
}