2012-04-23 74 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

相关问题