2012-04-23 73 views
0

我有一個文件佈局是這樣的:在MongoDB中構建嵌入式文檔的最佳方式是什麼?

Program = { 
    '_id':ObjectId('4321...'), 
    'Title':'The Title', 
    'Episodes':[ 
       { 
       'Ep_ID':'234122', # this is unique 
       'Title': 'Ep1', 
       'Duration':45.2 }, 
       'Ep_ID':'342343' # unique 
       'Title': 'Ep2', 
       'Duration':32.3 } 
       ] 
      } 

我想要做的是在每集內另一個嵌入的文檔,像這樣:

Program = { 
     '_id':ObjectId('4321...'), 
     'Title':'The Title', 
     'Episodes':[ 
       { 
       'Ep_ID':'234122' # this is unique 
       'Title': 'Ep1', 
       'Duration':45.2, 
       'FileAssets':[ 
          { 'FileName':'video1.mov', 'FileSize':2348579234 }, 
          { 'FileName':'video2.mov', 'FileSize':32343233 } 
          ] 
       }, 
       { 
       'Ep_ID':'342343' # unique 
       'Title': 'Ep2', 
       'Duration':32.3, 
       'FileAssets':[ 
          { 'FileName':'video1.mov', 'FileSize':12423773 }, 
          { 'FileName':'video2.mov', 'FileSize':456322 } 
          ] 
       } 
        ] 
      } 

不過,我想不出如何在「第三」級添加/修改/刪除文檔。這是可能的,甚至是好的設計?我非常喜歡在一個文檔中擁有所有數據,但管理似乎開始顯得過於複雜。

我想的另一個想法是使用碰巧存在的子文檔作爲關鍵字的唯一值。我想過我的子文檔,它們都有某種獨特的價值。所以我可以這樣做:

Program = { 
     '_id':ObjectId('4321...'), 
     'Title':'The Title', 
     'Ep_ID_234122':{episode data}, 
     'Ep_ID_342343':{episode data}, 
     'FileAsset_BigRaid_Video1.mov':{'Ep_ID_234122', + other file asset data}, 
     'FileAsset_BigRaid_video2.mov':{'Ep_ID_234122', + other file asset data} 
     } 

任何想法都會很棒!

回答

1

是的,你可以確定你的數據結構有這種嵌套。更重要的是,你絕對不需要做任何特別的事情來完成它(至少使用pymongo)。如果您需要更新現有文檔,只需使用更新光標獲取文檔,如果這是您的問題?至少,爲您的第一個想法,

。你對模式的第二個想法並不是一個很好的方式來構造數據。一方面,您不可能輕鬆遍歷程序文檔的子集,而無需對密鑰進行字符串匹配,而且這會變得非常昂貴。

這就是說,我目前正在處理一些主要的MongoDB性能問題,所以我可能會建議您將文件資產保存在單獨的集合中。如果您計劃讓這個數據集變大,它將使您稍後更容易擴展。

+0

謝謝,是的,結構正在我的腦海裏。好點重新匹配鍵上的字符串。我現在想的是嵌套,但最多隻有一層。所以我可以創建一個'FileAssets'列表並在每個文件資產中放入一個引用。我認爲這樣可以。否則,我會回到分開的集合。感謝您的反饋..真的很有幫助 – MFB 2012-04-23 08:48:54

相關問題