我有三个集合的数据,需要生成一个数据集,汇总来自这些集合的数据,并按日期范围过滤。
收藏品是:
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
}
我认为我需要首先在日期范围内创建一系列游戏,结合所有条目然后聚合条目数,最后输出与玩家数据的集合,这似乎是很多步骤而我我不知道该怎么做。
答案 0 :(得分:1)
您遇到这些问题的原因是您尝试将MongoDB用作关系数据库,而不是像面向文档的数据库。在许多集合中规范化数据通常会适得其反,因为MongoDB无法执行任何JOIN操作。当嵌套文档将其他对象嵌入数组而不是引用它们时,MongoDB可以更好地工作。在MongoDB中组织数据的一种更好的方法是让每个game
都有一个player
的数组参与其中,或者在每个player
中都有一个数组{ {1}}他们参与了。在这些数组中有一些冗余的额外数据也不一定是错误的,比如姓名,而不仅仅是ID。
但现在你遇到了问题,所以让我们看看我们如何处理它。
正如我所说,MongoDB不会做JOIN。无法一次访问多个集合中的数据。
您可以做的一件事是以编程方式解决问题。创建一个程序,为每个玩家提取所有game
,然后提取所有players
,然后entries
匹配的条目引用games
。
你可以尝试的另一件事是MapReduce。 MapReduce可用于将结果附加到另一个集合。您可以尝试将每个相关集合的一个MapReduce作业合并为一个,然后查询生成的集合。