0

在参考文章中,我找到了答案,但我是 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 }

我正在尝试获取所有 memfree 元素,然后计算平均值。我尝试根据上面引用的链接复制/粘贴对代码进行编程,首先它在一定程度上是有意义的,其次,它实际上并没有工作。

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

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

4

1 回答 1

3

这主要包含在group 函数的文档中

让我们分解一下:

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

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

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

我询问您使用的是哪个版本的原因是聚合框架,该框架现在在开发版本 (2.1) 中可用,并将在 2.2 中发布用于生产,极大地简化了对 MongoDB 集合的聚合查询。

希望这会有所帮助。

于 2012-06-04T00:16:19.677 回答