2013-10-31 50 views
4

我試圖存儲大量雙鏈接的文檔,即它們可以有前導和後繼。由於收集不同文件的存在,我不知道我是否能在其上創建一個可行指數:如何在MongoDB中創建(雙)鏈接列表結構?

{"_id": "1234", "title": "Document1", "content":"...", "next": "1236"} 
{"_id": "1235", "title": "Document2", "content":"...", "next": "1238"} 
{"_id": "1236", "title": "Document1a", "content":"...", "prev": "1234"} 
{"_id": "1237", "title": "Document2a", "content":"...", "prev": "1235", "next": "1238"} 
{"_id": "1238", "title": "Document2b", "content":"...", "prev": "1237", "next": "1239"} 
... 

因爲我需要一個文檔的整個「歷史」,包括上一個和下一個文件,我想我必須根據列表的大小執行多個查詢?

有關如何創建高性能指數的建議?用於存儲雙鏈表的不同結構也很有趣。

+1

什麼是使用模式,即你主要是讀或寫文件? –

+0

大部分時間我都會閱讀文件。存儲的文檔從不修改。如果文檔得到更新,我應該在列表末尾顯示爲新節點 – alexdeloy

回答

5

如果您想優化閱讀,您可以使用數組來存儲上一個和下一個文檔。

{ 
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238", 
    "prev": "1235", 
    "parents" : [1000, 1235] 
    "children" : [1238, 1239] 
} 

然後,您可以獲取所有文檔,其中_id可以在子代或父代數組中。如果您只需要文檔的父母或子女,此解決方案就很好。要獲得整個列表,您不能有效地使用帶有$或$和$ in操作符的索引。

替代性和可能是一個更好的解決方案是爲每個文件即孩子和家長的整個列表存儲在一個陣列:

{ 
    "_id": "1237", 
    "title": "Document1", 
    "content":"...", 
    "next": "1238", 
    "prev": "1235", 
    "list_ids" : [1000, 1235, 1238, 1239, 1237] 
} 

這樣,你可以在list_ids有一個索引,並得到所有與文件簡單的$查詢將會很快。

這兩種解決方案的問題在於,您在添加新文檔時需要更新所有相關文檔。所以這可能不是一個好的解決方案,如果你 會有一個寫入沉重的應用程序。

+2

謝謝Christian。你的回答讓我有一個不同的方向:我想我會保存一大堆沒有任何兄弟姐妹信息的文檔,只是按照所有相關文檔的順序維護一個列表。 – alexdeloy

+1

這是另一個有趣的方法。很高興有幫助。 –