1

我在 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-command 将这些详细信息添加到根文档中,如下所示:

collection.Update(query, Update.PushWrapped("Details", detail));

到目前为止,这很好用,我有可能阅读MyEntry没有附加的所有内容Details,我可以阅读所有/第一个/最后一个/Details我想要的任何一个。但是我现在的问题是,如果我在 an 中更改某些MyEntry内容并保存它,则Details-Array 将被完全删除。
有没有办法在更新时单独留下类中未提及的字段?

4

1 回答 1

1

您需要像对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 类,否则驱动程序在遇到意外的额外数据时可能会抛出错误。

于 2013-02-23T21:51:44.343 回答