假设我有一组这样的用户:-
{
"_id" : "1234",
"Name" : "John",
"OS" : "5.1",
"Groups" : [{
"_id" : "A",
"Name" : "Group A"
}, {
"_id" : "C",
"Name" : "Group C"
}]
}
我有一系列这样的事件:-
{
"_id" : "15342",
"Event" : "VIEW",
"UserId" : "1234"
}
我可以使用 mapreduce 来计算每个用户的事件数,因为我可以发出“UserId”并从中算出,但是我现在要做的是按组计算事件数。
如果我的事件文档中有一个“组”数组,那么这很容易,但是我没有,这只是一个例子,它的实际应用要复杂得多,我不想复制所有这些数据进入事件文档。
我在http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/看到了一个例子,但我看不出它在这种情况下是如何应用的,因为它是聚合值从两个地方......我真正想做的就是执行查找。
在 SQL 中,我只需将扁平化的 UserGroup 表加入事件表,然后 GROUP BY UserGroup.GroupName
我会对 mapreduce 的多次传递感到满意...首先通过 UserId 计数到类似 { "_id" : "1234", "count" : 9 } 但我在下一次传递时卡住了...如何包含组 ID
我考虑过的一些潜在方法:-
- 在活动文档中包含群组信息(不可行)
- 弄清楚如何“加入”用户集合或从 map 函数中查找用户组,这样我也可以发出组 ID(不知道该怎么做)
- 弄清楚如何将事件和用户集合“加入”到我可以运行 mapreduce 的第三个集合中
什么是可能的,每种方法的好处/问题是什么?