使用MongoDB的map / reduce来“分组”两个字段

时间:2010-05-12 06:52:42

标签: mongodb mapreduce

我需要比MongoDB文档中的示例稍微复杂的东西,我似乎无法绕过它。

假设我有一组{date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...}

形式的对象

现在我希望获得类似于SQL GROUP BY查询的内容,对日期和类型进行分组。也就是说,我想要每天每种类型的事件数量。另外,我想通过user_id使它成为唯一的,即。如果用户在同一天有更多活动,则只计算一次。

我正在尝试使用map / reduce。

我做

db.logs.mapReduce( 
    function() { 
        emit(this.type, 1); 
    }, 
    function(k, vals) { 
        var total = 0; 
        for (var i = 0; i < vals.length; i++) 
            total += vals[i]; 
        return total; 
    }
)

很好地按类型分组,但是现在,我怎样才能按日期分组?似乎emit()中的键不能是一个数组(我考虑过做emit([this.date, this.type], 1))。另外,我如何确保每用户的唯一性?

我刚开始使用MongoDB,我仍然无法掌握基本概念。此外,没有太多可用的文档。感谢更有经验的用户提供的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:19)

在MongoDB Cookbook中找到了一个非常好的解决方案(之前不知道这个资源)。

http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

基本上,要按多个键分组,您使用的是dict,而不是列表(我试过)。此外,要获得独特的结果,您需要制作两个map / reduce通道。

相关问题