![](/img/trans.png)
[英]How to aggregate the count/sum of 3 collections using MongoDb?
[英]Aggregate and Sum Data from mutliple MongoDB Collections filtered by date range
我有跨三个集合的数据,需要生成一个数据集,以汇总这些集合中的数据,并按日期范围进行过滤。
集合是:
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
}
我认为我需要先在日期范围内创建一个游戏集合,并与所有条目合并,然后汇总条目总数,最后输出包含玩家数据的集合,这似乎有很多步骤,但我没有确定如何去做。
遇到这些问题的原因是因为您尝试将MongoDB用作关系数据库,而不是面向文档的数据库。 由于许多MongoDB无法执行任何JOIN操作,因此标准化许多集合上的数据通常会适得其反。 当您嵌套了将其他对象嵌入数组而不是引用它们的文档时,MongoDB会更好地工作。 在MongoDB中组织数据的一种更好的方法是让每个game
都有参与其中的player
数组,或者让每个player
其中的game
拥有数组。这也不一定是错误的在这些数组中有一些多余的附加数据,例如名称,而不仅仅是ID。
但是现在您遇到了问题,所以让我们看看如何处理它。
就像我说的那样,MongoDB不执行JOIN。 无法一次访问多个集合中的数据。
您可以做的一件事就是以编程方式解决问题。 创建一个程序,该程序获取所有players
,然后获取每个players
所有entries
,然后获取startTime
匹配的条目所引用的games
。
您可以尝试的另一件事是MapReduce 。 MapReduce可用于将结果附加到另一个集合。 您可以尝试对每个相关集合使用一个MapReduce作业,然后查询结果集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.