我是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完成。
发布于 2011-05-21 09:42:53
您可以使用map-reduce或group()函数来计算这些聚合。我使用group()是因为它更简单、更快,但是如果您需要将查询分布在一个分片集群上,则应该使用map-reduce。
首先加载数据:
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 })每个团队,每天:
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 }
});要汇总每日聚合,只需更改密钥:
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 }
});发布于 2011-05-23 03:26:02
经过一些研究之后,我能够想出一个解决方案。我不满意这是最优化的解决方案,因为我不熟悉MongoDB和map/reduce的想法,所以如果有人有更好的东西,请纠正我。具体地说,我不能获得arr_team对象的长度,所以我必须有一个递增的计数器。
reduce函数:
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;
}最终确定:
function(out) {
out.avg_team_order_amount = out.total_amount/out.team_count;
}https://stackoverflow.com/questions/6078671
复制相似问题