部分无架构文档覆盖无架构值

本文关键字:覆盖 文档 | 更新日期: 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类中,否则驱动程序可能会在遇到意外的额外数据时抛出错误。