初学者解释特定领域mongodb的平均值做mapreduce或group之间的区别是什么

时间:2012-06-02 21:19:00

标签: mongodb mapreduce

在参考文章中,我找到了答案,但我是MongoDB的初学者,并且他们的文档对于初学者来说并没有得到很好的解释。我也在读克里斯蒂娜的书,所以我正在做作业。我认为这篇文章可能有助于其他用户试图弄清楚这一点,而不是传统的,我有问题,有人发布代码示例,他们从来没有真正理解发生了什么。

话虽这么说,我在下面列出的几个相互关联的事情上度过了一段非常艰难的时期,我发现了另一个关于这个问题的好问题和答案,但这只是一些代码并没有很好地解释为初学者蒙戈。此外,代码对我不起作用(http://stackoverflow.com/questions/6414312/fastest-way-to-get-the-average-of-a-specific-field-in-mongodb)。 :/

我有一些类似的文件:

{ "_id" : ObjectId("4fc7e9138c8b0f0d5200000f"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501393 }
{ "_id" : ObjectId("4fc7e9518c8b0f0d52000015"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501455 }
{ "_id" : ObjectId("4fc7e98f8c8b0f0d5200001b"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 463, "time" : 1338501517 }
{ "_id" : ObjectId("4fc7e9cd8c8b0f0d52000021"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501579 }
{ "_id" : ObjectId("4fc7ea0b8c8b0f0d52000027"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 446, "time" : 1338501641 }
{ "_id" : ObjectId("4fc7ea498c8b0f0d5200002d"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 424, "time" : 1338501703 }

我试图获取所有的memfree元素,然后计算平均值。我尝试基于上面引用的链接复制/粘贴编程代码,首先它是有意义的,直到某一点,其次,它实际上没有工作。

第2行)第一行是有道理的,非常自我解释 第3行)第二行计数:0,总计:0 - 是这些真/假开关吗? 第4行是否从mapReduce()函数调用相同的reduce?是doc和out关键字,还是我们任意定义它们? 其他)代码失败了,为什么?

最后一个子问题:我可以使用mapReduce做同样的事情吗?为什么我会使用mapReduce函数而不是这个组,如果我有分片我还需要计算平均值?

1 个答案:

答案 0 :(得分:3)

这主要涵盖在documentation of the group function

让我们分解一下:

db.test.group(
  - 对测试集合和组结果运行此查询 { cond: {"status": 1}
  - 我只关心满足这个条件的文件,所以过滤我的结果 , initial: {count: 0, total:0}
  - 我要跟踪两个变量count和total,让我们在输出文档中将它们初始化为零 , reduce: function(doc, out){ out.count++; out.total += doc.views }
  - 对于满足条件的每个文档,应用此函数(将计数增加1并将总计按文档中的视图数增加'输出' , finalize: function(out){ out.avg = out.total / out.count }
  - 当我们浏览完所有文档后,运行此功能,通过将总视图除以文档数量来计算平均视图,并将其放入我的“输出”文档中。
} );

如果您想按特定字段进行分组,还需要在引用示例key中添加另一行。没有它,您将获得整个集合的平均值。有了它,您可以获得“key”的每个不同值的单独平均值。

是的,reduce与你在map / reduce中写的功能相同。 “组”的限制是您只能获得符合您条件的“文档”。在map reduce中,您可以使用“map”函数根据输入文档发出任意文档。

我询问您使用的是哪个版本的原因是Aggregation framework现在可以在开发版本(2.1)中使用,并且将在2.2中发布用于生产,这极大地简化了对MongoDB集合进行聚合查询的过程。

希望这有点帮助。