mongodb复杂地图/减少 - 或者我认为

时间:2011-12-04 06:24:22

标签: mongodb

我有一个包含每笔销售的mongodb系列,看起来像这样

{_id: '999', buyer:{city:'Dallas','state':'Texas',...}, products: {...}, order_value:1000, date:"2011-11-23T11:34:33Z" }

我需要在过去的30,60和90天内按州显示订单量的统计数据。 所以,得到这样的东西

State          Last 30       Last 60     Last 90
Arizona        12000         22000       35000
Texas          5000          9000        16000

如何在单个查询中执行此操作?

1 个答案:

答案 0 :(得分:0)

这不是很难:

map = function() {
   emit({key : this.buyer.state, value : order_value})
}

reduce = function(key,values) {
    sum = 0;
    values.forEach( function(o) {
         sum += o
         }
    return sum
   }

然后您使用查询{date:{$ gt:{[today minus 30 days]}}缩小您的收藏集 (我会记住语法,但你应该在mongodb网站上使用优秀的mapreduce文档)。

为了更有效地使用地图缩小功能,请先考虑incremental map reduce在过去30天内先查询,然后再次(逐步增加)地图过滤-60到-30天,以获取有关las t60天的信息。最后,运行增量映射减少过滤-60到-90天以获得最后90天。

这不错,因为你有3个查询,但你只重新计算你尚未拥有的数据的聚合。

我可以提供示例,但您现在应该可以自己做。