繁体   English   中英

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

[英]How to update but not replace a document using updateOne() of the MongoDB-driver for .NET

情况:

我在 MongoDB 中有一个现有的文档集合,我想在其中使用传入文档的字段更新特定文档的字段 传入文档与集合中的文档具有相同的 class,但并非所有字段都已设置,即某些字段为 null。 现在,我不想替换集合中的整个文档,也不想替换所有字段,但我只想替换那些不是 null 的字段,并保持 rest 原样

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

public void Update(string id, MyDoc docIn) => _docs.ReplaceOne(doc =>  scan.Id.Equals(ObjectId.Parse(id)), docIn);

为了更新文档中的各个字段, 文档建议创建一个 "Update Operator Expressions Document"

我的问题:

这是否意味着我必须编写自己的 function 将传入的文档变成这样的“更新运算符表达式文档”还是有更方便的方法?

正如您已经说过的,使用更新运算符是 go 的方法。
这个想法是使用过滤器并使用通过属性的 Object 的反射

您可以根据需要修改更新和过滤 Function。

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM