【问题标题】:Using MongoDB's map/reduce to "group by" two fields使用 MongoDB 的 map/reduce 来“分组”两个字段
【发布时间】:2010-05-12 06:52:42
【问题描述】:

我需要比 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,但我仍然无法掌握基本概念。此外,那里没有太多可用的文档。感谢经验丰富的用户提供的任何帮助。谢谢!

【问题讨论】:

  • couchdb 可以将数组作为键,只是说'

标签: mongodb mapreduce


【解决方案1】:

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

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

基本上,要按多个键进行分组,您使用的是字典,而不是列表(正如我尝试过的那样)。此外,要获得独特的结果,您需要进行两次 map/reduce 传递。

【讨论】:

  • 链接无效。任何对少数字段进行分组/发射感兴趣的人都可以使用以下结构:emit( { date:this.date, type:this.type} , 1 )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多