以一对多模式获取值的总和

时间:2018-06-14 21:51:03

标签: mongodb

我正在考虑如何在mongo中为网站构建我的数据库。以下是一个Event对象的数据外观:

-Event
  - multiple teams
    - multiple individual campaigns
      - multiple donors
        - one donation amount

我想在任何时间点知道活动中的捐赠总额。

我可以通过两种方式构建这个db:

  1. 如果我将Event,Team,IndividualCampaign和Donor各自置于其中 收集,得到这个总数需要多次查询我 假设
  2. 如果我把这个全部放在一个嵌套在数组中的巨型事件文档中 对于其他人来说,这听起来也不是一个好主意。
  3. 最好的方法是什么? #1并在事件中保存总和?

    由于

1 个答案:

答案 0 :(得分:0)

因此,有一些标准可以将子集合转换为各自的集合,即问自己:

  1. 这个子集可以无限增长吗?如果是,那么你需要将它作为自己的集合。
  2. 这些子实体可以自己存在吗?或者他们自己有意义吗?如果是,那么这很可能是它自己的集合。
  3. 是否可以/另一个实体会引用此子集合中的项目?例如,在您的示例中,一个事件有多个Team s,其他实体可以引用Team吗?如果是,那么这更可能是它自己的集合。
  4. 您需要多长时间自行引用此子集合中的元素?例如,如果您经常需要从该事件中查询团队,那么您将需要检索整个事件以获得该团队。
  5. 对你的问题的恰当答案很可能是两种方法之间的混合,但首先要回答你的假设:

      

    如果我将Event,Team,IndividualCampaign和Donor各自放入其自己的集合中,那么获取此总数将需要我假设的多个查询。

    您可以使用Aggregation Framework并依赖$lookup运算符将其加入到单个查询中。从技术上讲,这可以满足您在单次往返中获取此总数的要求。

      

    如果我将这一切都放在一个嵌套在数组中的巨型事件文档中,那么这听起来也不是一个好主意。

    是的,对我来说这听起来也不是一个好主意。

    那么你有几个选择:

    • 听起来,我不知道你的领域,团队和捐赠者的重要性足以值得他们自己的收藏品。
    • 你可以反规范化。换句话说,以构建更高级的逻辑为代价,您可以将这些项目放在它们自己的集合中,并且STILL会在这个事件对象中保留一些非规范化的数据。

    例如,你可以拥有一个totalDonations字段,每当事件的成员发生变化时你都会更新。但显然你在这里负责保持一致性。

    最后,您应该评估数据的关系,如果您发现在域的大部分时间内遇到此问题,那么关系数据库可能是您的最佳选择。