在参考文章中,我找到了答案,但我是MongoDB的初学者,他们的文档对于初学者来说并没有很好的解释。我也在读克里斯蒂娜的书,所以我在做功课。我认为这篇文章可能会帮助其他试图解决这个问题的用途,而不是传统的,我有一个问题,有人发布了一个代码示例,他们从来没有真正理解发生了什么。
话虽如此,我在下面列出的一些相互关联的事情上遇到了非常困难的时期,我找到了另一个关于这个问题的好问题和答案,但它只是一些代码,对于初学者来说并没有很好地解释 mongo。代码也对我不起作用(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 }
我正在尝试获取所有无内存元素,然后计算平均值。我尝试根据上面引用的链接复制/粘贴代码,首先它在一定程度上是有意义的,其次,它实际上不起作用。
第2行)第一行有意义,不言自明第 3 行)第二行计数:0,总计:0 - 这些是真/假开关吗?第 4 行)这是否从 mapReduce() 函数调用相同的 reduce?是doc和out关键字,还是我们任意定义它们?其他)代码无论如何都失败了,为什么?
最后一个子问题:我可以使用mapReduce做同样的事情吗,为什么我要使用mapReduce函数而不是组,如果我有分片,我也需要计算平均值?
这主要在组函数的文档中介绍。
让我们分解一下:
db.test.group(
- 对测试集合和分组结果运行此查询。{ cond: {"status": 1}
- 我只关心满足此条件的文档,因此请过滤我的结果。, initial: {count: 0, total:0}
- 我将跟踪两个变量,count 和 total,让我们在输出文档中将它们初始化为零。, reduce: function(doc, out){ out.count++; out.total += doc.views }
- 对于满足条件的每个文档,应用此功能(它将计数增加 1,并将总数增加文档"out"
中的查看次数 , finalize: function(out){ out.avg = out.total / out.count }
- 当我们浏览完所有文档后,运行此函数,它将通过将总视图除以文档数量来计算平均视图,并将其放入我的"out"文档中。
} );
还有另一行不需要在引用的示例中key
如果要按特定字段分组,则需要该行。 没有它,您将获得整个集合的平均值。 有了它,您可以获得"键"的每个不同值的单独平均值。
与您可能在map/reduce中编写的函数相同。 "组"的限制是您只能获得符合您条件的"文档"。 在mapreduce中,您可以使用"map"功能根据输入文档发出任意文档。
我问你使用的是哪个版本的原因是聚合框架,它现在在开发版本(2.1)中可用,并将在2.2中发布用于生产,极大地简化了对MongoDB集合的聚合查询。
希望这有所帮助。