我有这样的文档布局:
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 }
]
}
]
}
但是,我无法弄清楚如何在'3rd'级别添加/ mod / del doc。有可能甚至是好的设计吗?我非常希望将所有数据都放在一个文档中,但管理开始变得过于复杂。
我的另一个想法是使用子文档中存在的唯一值作为键。我考虑过我的子博士,他们都有某种独特的价值。所以我可以这样做:
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}
}
任何想法都会很棒!
答案 0 :(得分:1)
是的,你绝对可以构建你的数据以进行这种嵌套。更重要的是,你绝对不需要做任何特别的事情来完成它(至少使用pymongo)。如果您需要更新现有文档,那么只需使用更新光标获取文档,如果这是您的问题吗?
至少,为了你的第一个想法。你对模式的第二个想法并不是构建数据的好方法。例如,如果不对密钥进行字符串匹配,就不可能轻松地迭代程序文档的子集,这将变得昂贵。
那就是说,我目前正在处理一些主要的MongoDB性能问题,所以我建议你将文件资产保存在一个单独的集合中。如果您计划将此数据集变大,它将使您以后更容易扩展。