如何使用 .NET 的 MongoDB-驱动程序的 updateOne() 更新但不替换文档
How to update but not replace a document using updateOne() of the MongoDB-driver for .NET
情况:
我在 MongoDB 中有一个现有的文档集合,我想在其中 使用传入文档的字段更新特定文档的字段 。
传入文档与集合中的文档具有相同的 class,但并非所有字段都已设置,即某些字段为空。
现在,我不想替换集合中的整个文档,也不想替换所有字段,但是我只想替换那些不为空的字段,其余的保持原样.
描述了如何替换整个文档。我用这段代码得到了这个:
public void Update(string id, MyDoc docIn) => _docs.ReplaceOne(doc => scan.Id.Equals(ObjectId.Parse(id)), docIn);
为了更新文档中的各个字段,the docs suggest creating an "Update Operator Expressions Document"。
我的问题:
这是否意味着我必须编写自己的函数将传入的文档变成这样的“更新运算符表达式文档”,或者是否有更方便的方法?
如您所说,使用更新运算符是正确的选择。
这个想法是使用过滤器并使用通过属性的对象的 反射。
您可以根据需要修改更新和过滤功能。
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;
}
情况:
我在 MongoDB 中有一个现有的文档集合,我想在其中 使用传入文档的字段更新特定文档的字段 。 传入文档与集合中的文档具有相同的 class,但并非所有字段都已设置,即某些字段为空。 现在,我不想替换集合中的整个文档,也不想替换所有字段,但是我只想替换那些不为空的字段,其余的保持原样.
public void Update(string id, MyDoc docIn) => _docs.ReplaceOne(doc => scan.Id.Equals(ObjectId.Parse(id)), docIn);
为了更新文档中的各个字段,the docs suggest creating an "Update Operator Expressions Document"。
我的问题:
这是否意味着我必须编写自己的函数将传入的文档变成这样的“更新运算符表达式文档”,或者是否有更方便的方法?
如您所说,使用更新运算符是正确的选择。
这个想法是使用过滤器并使用通过属性的对象的 反射。
您可以根据需要修改更新和过滤功能。
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;
}