来自多个MongoDB集合的聚合和汇总数据按日期范围过滤

时间:2013-09-30 11:59:28

标签: mongodb

我有三个集合的数据,需要生成一个数据集,汇总来自这些集合的数据,并按日期范围过滤。

收藏品是:

db.games
{
 _id : ObjectId,
 startTime : MongoDateTime
}

db.entries
{
 player_id : ObjectId,   // refers to db.players['_id']
 game_id : ObjectId      // refers to db.games['_id']
}

db.players
{
 _id : ObjectId,
 screen_name,
 email
}

我想返回一个集合,该集合是指定范围内游戏的玩家条目数。输出应该是这样的:

output
{
  player_id,
  screen_name,
  email,
  sum_entries
}

我认为我需要首先在日期范围内创建一系列游戏,结合所有条目然后聚合条目数,最后输出与玩家数据的集合,这似乎是很多步骤而我我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

您遇到这些问题的原因是您尝试将MongoDB用作关系数据库,而不是像面向文档的数据库。在许多集合中规范化数据通常会适得其反,因为MongoDB无法执行任何JOIN操作。当嵌套文档将其他对象嵌入数组而不是引用它们时,MongoDB可以更好地工作。在MongoDB中组织数据的一种更好的方法是让每个game都有一个player的数组参与其中,或者在每个player中都有一个数组{ {1}}他们参与了。在这些数组中有一些冗余的额外数据也不一定是错误的,比如姓名,而不仅仅是ID。

但现在你遇到了问题,所以让我们看看我们如何处理它。

正如我所说,MongoDB不会做JOIN。无法一次访问多个集合中的数据。

您可以做的一件事是以编程方式解决问题。创建一个程序,为每个玩家提取所有game,然后提取所有players,然后entries匹配的条目引用games

你可以尝试的另一件事是MapReduce。 MapReduce可用于将结果附加到另一个集合。您可以尝试将每个相关集合的一个MapReduce作业合并为一个,然后查询生成的集合。