簡體   English   中英

MongoDB C# 驅動程序 - POCO 引用的序列化?

[英]MongoDB C# driver - serialization of POCO references?

我目前正在研究MongoDB 據我了解,官方的C#驅動可以進行 POCO 的序列化和反序列化。 我還沒有找到關於如何序列化兩個對象之間的引用的信息。 [我說的是可以表示為兩個單獨的文檔的東西,帶有 ID 鏈接,而不是嵌入文檔。

序列化機制能處理這種情況嗎? (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;}
}

更新:

那么只有幾個相關的問題......

a)如果序列化器能夠處理情況(1)。 在不使用嵌入的情況下如何做到這一點的例子是什么?

b)如果使用嵌入,是否可以查詢所有“事物”,無論它們是“父母”還是嵌入元素? 這樣的查詢會是什么樣子?

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

  1. 如您所料,它將使用嵌入來表示
  2. object 圖中不能有循環路徑,否則會發生堆棧溢出

如果要將其存儲為單獨的文檔,則必須使用第二個 class (2) 並進行多次插入。

當 object 存儲為一個具有嵌套嵌入的大型文檔時,實際上不可能跨多個級別進行查詢。 您可能想查看一些替代方案,例如:

https://docs.mongodb.com/manual/applications/data-models-tree-structures/

是的,這是完全可能的。

關於 MongoDB 和大多數 NoSQL 解決方案,您必須了解的一件事是對象可以包含在其他對象中。 In the case of MongoDB, it's basically, if you can create the object in JSON, then you can create the object in MongoDB.

一般來說,您應該努力擁有一個“相對”非規范化的數據庫結構。 只要您不經常更新它,一點點重復的數據就可以了。

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

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

因此,簡化一下,如果Id類似於“T00001”(或者實際上是 T + GUID),您可以通過查詢以 T 開頭的 Id之類的東西,並為它們設置對象(或只是對於您知道的包含您的參考的子集,如果它是一個非常大的集合)。

你知道/期望RelatedThing是一個Thing ,但是當它從 Mongo 返回時它只是一個字符串。 但是,如果您已按上述方式設置對象,則可以像使用 object 引用一樣有效地使用該字符串(畢竟,這就是它的真正含義,是“手動”完成的)。

它是一種“松散”的方式,但可能對您有用。

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

如果你真的想引用另一個文檔,你可以使用DBRef 但是 MongoDB 中的參考文獻存在限制。

  • 您只能在 ref 上通過 id 查詢
  • 當您獲得 Thing 的文檔時,您必須進行第二次查詢以獲取關聯的 RelatingThing 的文檔,因為 MongoDB 中不存在連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM