我在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
- 数组将被完全删除。
有没有办法在更新时单独留下类中没有提到的字段?
答案 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类,否则驱动程序在遇到意外的额外数据时可能会抛出错误。