首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有MongoDB的嵌套Group By函数

带有MongoDB的嵌套Group By函数
EN

Stack Overflow用户
提问于 2011-05-21 07:57:02
回答 2查看 863关注 0票数 3

我是MongoDB的新手,很长一段时间的MySQL,遇到了一点小障碍。

给定以下示例数据:

TeamID日OrderAmount

100%-4月份-50年-4月份

100%*40

200%-4月份-4月份-50年

100%;2010年4月2日;2010年4月

我正在试着找出团队每天的平均订单量。我可以用mapReduce函数做一个简单的查询,用TeamId & Day做一个分组。所以现在我有了:

TeamID*AvgAmount

100%*45*45

200亿元人民币,4%元人民币,4%元人民币,50%元人民币

100元人民币/元人民币*

现在,我尝试汇总这些数据,以获得每个团队每天的平均订单量,即:

第一天:第二天:第二天:AvgAmount

4/1%*47.5

4/2月4日:35月35日

我可以用MySQL很容易做到这一点,但我很难搞清楚如何用MongoDB做到这一点,而不是在应用程序端手动完成,而不是用MongoDB完成。

EN

回答 2

Stack Overflow用户

发布于 2011-05-21 09:42:53

您可以使用map-reduce或group()函数来计算这些聚合。我使用group()是因为它更简单、更快,但是如果您需要将查询分布在一个分片集群上,则应该使用map-reduce。

首先加载数据:

代码语言:javascript
复制
db.orders.insert( { teamid: 100, date: "4/1", amount: 50 })
db.orders.insert( { teamid: 100, date: "4/1", amount: 40 })
db.orders.insert( { teamid: 200, date: "4/2", amount: 50 })
db.orders.insert( { teamid: 100, date: "4/2", amount: 20 })

每个团队,每天:

代码语言:javascript
复制
db.orders.group({
    key: { teamid: true, date: true },
    reduce: function(doc, out) { out.sum += doc.amount; out.count++; },
    initial: { sum: 0, count: 0 },
    finalize: function(out) { out.average = out.sum / out.count }
});

要汇总每日聚合,只需更改密钥:

代码语言:javascript
复制
db.orders.group({
    key: { date: true },
    reduce: function(doc, out) { out.sum += doc.amount; out.count++; },
    initial: { sum: 0, count: 0 },
    finalize: function(out) { out.average = out.sum / out.count }
});
票数 4
EN

Stack Overflow用户

发布于 2011-05-23 03:26:02

经过一些研究之后,我能够想出一个解决方案。我不满意这是最优化的解决方案,因为我不熟悉MongoDB和map/reduce的想法,所以如果有人有更好的东西,请纠正我。具体地说,我不能获得arr_team对象的长度,所以我必须有一个递增的计数器。

reduce函数:

代码语言:javascript
复制
    function(doc, prev) { 
      var retVal  = {team_count: 0, day_total: 0};

      if(!prev.arr_team[doc.team_id]) {
        prev.arr_team[doc.team_id] = 0;
        prev.team_count++;
      }

      prev.arr_team[doc.team_id]++;

      prev.order_count++; 
      if(doc.total_amount)
         prev.total_amount += doc.total_amount 

      return retVal;
    }

最终确定:

代码语言:javascript
复制
function(out) {
      out.avg_team_order_amount = out.total_amount/out.team_count;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6078671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档