2010-10-21 51 views
2

我有一個類似的模式: (簡體)延遲加載MongoDB中與規範

問:

public class Question 
{ 
    public string QuestionID { get; set; } 

    public string Title { get; set; } 
    public string Body { get; set; } 

    public List<Answer> Answers { get; set; } 
} 

答:

public class Answer 
{ 
    public string QuestionID { get; set; } 
    public string Body { get; set; } 
} 

我打算將數據存儲在MongoDB中,並且希望使用NoRM

我的問題是:延遲加載支持?或者我可以將它設置爲在文檔存儲上進行延遲加載..?

因此,請求一個問題,也檢索答案..? (兩者都將「帖子」存儲在MongoDB上的同一個集合中)

+0

你究竟在這裏的意思是延遲加載? – RameshVel 2010-10-22 11:06:57

+0

我的意思是 - 當我檢索蒙戈一個「問題」的文檔,答案不是從數據庫得到到tolist()或類似的被稱爲...是問題和答案存儲 – Alex 2010-10-22 12:21:39

+0

究竟如何?答案是否嵌入在問題文件中?或者每個人都自己回答文件? – TTT 2010-10-22 18:36:30

回答

6

好的,「懶加載」的概念對MongoDB等數據庫來說大多是外來的。看看你的模式:Question有一個ListAnswers

RDBMS「惰性」部分允許您將「列表」與原始文件分開加載。實際上有兩個查詢發生,你只是想延遲第二個查詢。

MongoDB只有一個查詢發生。 Answers嵌入在問題的內部,因此您對Questions的請求自動包含Answers的列表。

請看看在NORM樣本的這更好的例子:http://normproject.org/samples

最基本的一點是,你所提供的結構不再多個表。這只是一個嵌入文檔的集合。所以「懶加載」的概念實際上是不必要的,因爲你不能「懶加載」一個查詢。

+3

我不認爲我同意。雖然是嵌入在MongoDB中一定常做的(甚至大部分時間)與IDS的連接使用,以及時肯定有很多次。這是延遲加載相關的上下文。但我自己還沒有找到完美的答案。 – 2012-11-28 16:46:10

+0

要清楚,這是對不再支持的產品問題的回答:) https://github.com/atheken/NoRM – 2012-11-28 20:39:50

+0

那是對的。儘管我認爲所有這一切同樣適用於mongoDB和當前支持10Gen的驅動程序。正如我所說,我還沒有找到完美的解決方案。 – 2012-11-28 22:04:35

4

我明白這是一個古老的線索,但其他人可能仍然會找到它(就像我一樣)。延遲加載在MongoDB中都是可能的,並且由C#驅動程序支持。

退房以下類:LazyBsonDocument和LazyBsonArray

從C#驅動程序的教程文檔:「懶惰類是特殊的,因爲它們推遲BSON的反序列化直到需要它這是因爲當只有你有用需要一個或兩個複雜文檔,因爲它不會導致反序列化整個文檔或數組的成本,而只是需要的部分,這種反序列化一次發生一個級別。「

在撰寫教程文件的時候可以在這裏找到:http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/

給出的例子是非常相似的,因爲它涉及到一個嵌套集合的問題,所以它看起來像答案確實可以列表懶惰加載,如果這是可取的。

希望這可以幫助別人,

尼克

+0

-1 - 這個問題是關於規範(現在不推薦使用MongoDB的包裝/ ORM)當你的答案是正確的,它不是在這個問題的背景下。 – Alex 2013-12-04 09:20:05

+1

公平 - 我仍然認爲答案增加了價值,因爲它在接受的答案中糾正了錯誤的斷言,即懶加載對MongoDB而言是外來的 - 所以這個帖子在給出的答案的上下文中是有效的。 – user1401260 2013-12-04 18:05:00