【问题标题】:Count frequency of an year一年的计数频率
【发布时间】:2026-02-22 12:45:01
【问题描述】:

我正在尝试用 map/reduce 计算一年的频率,这里是代码

map = %Q{
  function(){
    emit({}, { 
      year: this.birthdate.getFullYear(),
      count: 1
    })
  }
}
reduce = %Q{
  function(key, values){
    var agg = { }
    values.forEach( function(value){
      if(agg[value.year]){
        agg[value.year] += value.count
      } else {
        agg[key] = value.count
      }
    })
    return agg
  }
}
User.map_reduce(map, reduce).out(inline: true)

然后它返回

=> [{"_id"=>{}, "value"=>{"2004"=>2.0, "2002"=>1.0, "2005"=>1.0}}] 

但我的数据库中有很多年,而这只是跟踪其中的 3 年。我该怎么做?

【问题讨论】:

  • 您也可以使用聚合框架来执行此操作。你的查询模式是什么?你能不能把这些年插入和静态存储?

标签: mongodb mapreduce mongoid3


【解决方案1】:

现在它的工作...这是代码

map = %Q{
  function(){
    var today = new Date()
    var age = today.getFullYear() - this.birthdate.getFullYear()
    var m = today.getMonth() - this.birthdate.getMonth()
    if (m < 0 || (m === 0 && today.getDate() < this.birthdate.getDate()))
        age--

    emit(age, { count: 1 })
  }
}
reduce = %Q{
  function(key, values){
    var sum = 0

    values.forEach( function(value){
      sum += value.count
    })

    return { count: sum }
  }
}

scoped.map_reduce(map, reduce).out(inline: true)

【讨论】: