2012-04-23 4 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 } 
          ] 
       } 
        ] 
      } 

Однако, я не могу понять как добавить/mod/del doc на уровне «3-го». Возможно ли это или даже хороший дизайн? Мне очень хотелось бы иметь все данные в одном документе, но управление начинает казаться слишком сложным.

Другая мысль, которую я имел, заключалась в использовании уникальных значений, которые существуют для субдокторов в качестве ключей. Я думал о своих поддоках, и у всех их есть уникальная ценность. Поэтому я мог бы это сделать:

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