2011-07-01 63 views
7

我在研究MongoDB。我的理解是官方的C#驅動程序可以執行POCOs的序列化和反序列化。我還沒有找到的信息是兩個對象之間的引用是如何序列化的。 [我正在談論的東西將被表示爲兩個單獨的文檔,帶有ID鏈接,而不是嵌入文檔。MongoDB C#驅動程序 - 序列化的POCO參考?

序列化機制能處理這種情況嗎? (1):

class Thing { 
    Guid Id {get; set;} 
    string Name {get; set;} 
    Thing RelatedThing {get; set;} 
} 

還是必須犧牲一些OOP,做這樣的事情? (2):

class Thing { 
    Guid Id {get; set;} 
    string Name {get; set;} 
    Guid RelatedThing_ID {get; set;} 
} 

UPDATE:

只是一對夫婦的則相關的問題......

a)如果串行器能夠處理情況(1)。如何在不使用嵌入的情況下執行此操作的示例是什麼?

b)如果使用嵌入,是否可以跨所有'事物'查詢,而不管它們是父母還是嵌入元素?這樣的查詢將如何?

回答

11

C#驅動程序可以處理序列化包含對其自身另一個實例(1)的引用的類。但是:

  1. 正如你猜測,它將使用嵌入表示此
  2. 必須有對象圖中沒有循環路徑或如果你想存儲它堆棧溢出會發生

作爲單獨的文件,你將不得不使用你的第二類(2)並做多次插入。

當對象以嵌套嵌入形式存儲爲一個大型文檔時,跨多個級別查詢並不是真的有可能。你可能想看看像一些替代方案:

http://www.mongodb.org/display/DOCS/Trees+in+MongoDB

0

是的,這是完全可能的。

你必須瞭解MongoDB和大多數NoSQL解決方案的一件事是對象可以包含在其他對象中。就MongoDB而言,基本上,如果您可以使用JSON創建對象,那麼您可以在MongoDB中創建對象。

一般來說,你應該努力擁有一個「相對」非規範化的數據庫結構。只要你不經常更新,一點點重複的數據就可以。

+0

謝謝 - 我已經將問題稍微擴展了一點:o – UpTheCreek

0

如果真要到另一個文檔的參考,您可以使用DBRef。但是在MongoDB中引用有限制。

  • 只能通過ID對裁判
  • 當你拿到你的東西的文檔查詢,你將不得不進行第二次查詢來獲取相關RelatingThing的文檔加入不存在於MongoDB中。
0

我最近遇到了同樣的問題,我通常會避開它們,但是......我想這對於部署在Id字段中的重要編號系統可能是一個很好的用法。

class Thing { 
string Id {get; set;} 
string Name {get; set;} 
string RelatedThing {get; set;}} 

因此,簡化,如果編號是像「T00001」(或者實際上T + GUID),你可以很容易地通過查詢類似標識得到組來自蒙戈東西從T開始,併爲它們全部設置對象(或者只爲您知道的子集包含您的引用,如果它是非常大的集合)。

你知道/期望RelatedThing是一個事情,但它只是一個字符串時,它來自蒙戈回來。但是如果你已經像上面那樣設置了對象,那麼你可以像使用對象引用一樣有效地使用字符串(畢竟,這就是它的實質,完成了「手動」操作)。

它做它的「寬鬆」方式,但可能是可行的爲您服務。

任何人都可以看到這種方法的任何陷阱?

相關問題