【问题标题】:What is the best way to structure embedded docs in MongoDB?在 MongoDB 中构建嵌入式文档的最佳方法是什么?
【发布时间】:2012-04-23 03:28:59
【问题描述】:

我有一个这样的文档布局:

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”级别添加/修改/删除文档。有可能,甚至是好的设计吗?我非常希望在一个文档中包含所有数据,但管理似乎开始变得过于复杂。

我的另一个想法是使用子文档中恰好存在的唯一值作为键。我考虑过我的子文档,它们都有某种独特的价值。所以我可以这样做:

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}
        }

任何想法都会很棒!

【问题讨论】:

    标签: python mongodb embedding pymongo


    【解决方案1】:

    是的,您绝对可以将数据结构化为具有这种嵌套。更重要的是,您绝对不需要做任何特别的事情来完成它(至少使用 pymongo)。如果您需要更新现有文档,只需使用更新光标获取您的文档,如果这是您的问题?

    至少,对于您的第一个想法。您对架构的第二个想法根本不是构建该数据的好方法。一方面,如果不对键进行字符串匹配,您就不可能轻松地迭代 Program 文档的子集,而且成本会很高。

    也就是说,我目前正在处理一些主要的 MongoDB 性能问题,因此我可能会建议您将文件资产保存在单独的集合中。如果您计划将此数据集变大,它将使您以后更容易扩展。

    【讨论】:

    • 谢谢,是的,这个结构让我很头疼。重点是键上的字符串匹配。我现在想的是嵌套,但最多只有一层。所以我可以创建一个FileAssets 列表,并在每个文件资产中为剧集添加一个引用。我认为这会很好。否则我会回到单独的集合中。感谢您的反馈.. 真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2011-07-09
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多