0

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

收藏品是:

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
}

我想我需要从创建日期范围内的游戏集合开始,结合所有条目,然后汇总条目数量,最后输出包含玩家数据的集合,这似乎有很多步骤,我不是确定如何去做。

4

1 回答 1

1

之所以会出现这些问题,是因为您尝试将 MongoDB 用作关系数据库,而不是像面向文档的数据库。在许多集合上规范化数据通常会适得其反,因为 MongoDB 无法执行任何 JOIN 操作。当您有嵌套文档时,MongoDB 工作得更好,这些文档将其他对象嵌入到数组中而不是引用它们。在 MongoDB 中组织数据的更好方法是让每个game人都有一个players 数组参与其中,或者在每个数组中都有一个数组,其中包含他们参与playergames。有一些冗余也不一定是错误这些数组中的其他数据,例如名称,而不仅仅是 ID。

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

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

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

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

于 2013-09-30T12:47:53.077 回答