部分无架构文档覆盖无架构值
本文关键字:覆盖 文档 | 更新日期: 2023-09-27 18:01:01
我在C#中有一个类,类似于:
public class MyEntry
{
public ObjectId Id { get; set; }
public string SimpleHash { get; set; }
public string GroupIdentifier { get; set; }
}
现在把它保存在mongo中可以正常工作。现在我想在此文档中添加一些子文档。子文档的类如下所示:
public class Detail
{
public DateTime CreateDate { get; set; }
public string DetailHash { get; set; }
}
我用Push命令将这些细节添加到根文档中,如下所示:
collection.Update(query, Update.PushWrapped("Details", detail));
到目前为止,这效果很好,我可以在没有所有附加Details
的情况下读取MyEntry
,并且我可以读取所有/第一个/最后一个/我想要的任何Details
。但我现在的问题是,如果我更改MyEntry
中的某些内容并保存它,Details
-数组将被完全删除
有没有一种方法可以在更新时保留类中未提及的字段?
您需要像使用Detail
一样使用更新。如果您只是将整个C#类的本机序列化到MongoDB集合中,那么您将覆盖整个文档,正如您所看到的那样。
public class MyEntry
{
public ObjectId Id { get; set; }
public string SimpleHash { get; set; }
public string GroupIdentifier { get; set; }
}
var update = Update<MyEntry>.Combine(
Update<MyEntry>.Set(m => SimpleHash, "TheHash!"),
Update<MyEntry>.Set(m => GroupIdentifier, "MyGroup"));
然后,使用查询将文档Update
传递到集合中,并传递上面的update
构建器对象。(当然,您可以根据需要更改属性(。我更喜欢这种方法,而不是试图合并一个对象,因为这意味着我不需要担心部分加载的C#对象,或者因为没有设置属性而意外地从MongoDB文档中删除属性。
我预计,在去序列化期间,您可能需要将属性[BsonIgnoreExtraElements]
添加到MyEntry类中,否则驱动程序可能会在遇到意外的额外数据时抛出错误。