2013-02-23 60 views
1

我在C#中的一類,像這樣:部分無模式的文檔,並覆蓋無模式的值

public class MyEntry 
{ 
    public ObjectId Id { get; set; } 
    public string SimpleHash { get; set; } 
    public string GroupIdentifier { get; set; } 
} 

現在蒙戈保存這個工程,因爲它應該。現在我想爲此文檔添加一些子文檔。子文檔的類看起來是這樣的:

public class Detail 
{ 
    public DateTime CreateDate { get; set; } 
    public string DetailHash { get; set; } 
} 

我的詳細信息添加到與推命令的根文件,像這樣:

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

這工作不錯,到目前爲止,我有可能閱讀MyEntry沒有全部附加Details,我可以讀取所有/第一/最後/我想要的Details。 但現在我的問題是,如果我改變MyEntry中的某些內容並保存它,則Details-Array將被完全刪除。
更新時有沒有辦法讓字段中沒有提到的字段?

+0

請注意,「保存」只是說「保存這整個文檔」 - 正如答案中所述,更新是你真正想要的。 – 2013-02-23 23:16:19

回答

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類中,或者驅動程序在遇到意外的額外數據時可能會引發錯誤。

+0

感謝您的回答,我希望避免「手動」更新所有屬性,但它看起來像我必須忍受它。 – Roemer 2013-02-24 12:00:45

+0

不支持「合併」。 – WiredPrairie 2013-02-24 12:26:12