部分无模式文档覆盖无模式值

时间:2013-02-23 21:10:16

标签: c# mongodb overwrite schemaless

我在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));

到目前为止这种方法效果很好,我可以阅读MyEntry而没有全部附加Details,我可以阅读所有/第一个/最后一个/ {I} {我想要的Details。 但我现在的问题是,如果我在MyEntry中更改某些内容并将其保存,则Details - 数组将被完全删除。
有没有办法在更新时单独留下类中没有提到的字段?

1 个答案:

答案 0 :(得分: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文档中删除属性,因为它们没有被设置。

我希望您可能需要在derserialization期间将属性[BsonIgnoreExtraElements]添加到MyEntry类,否则驱动程序在遇到意外的额外数据时可能会抛出错误。