mapReduce
MongoDB中的MapReduce可以用来实现更复杂的聚合命令,使用MapReduce主要实现两个函数:map函数和reduce函数,map函数用来生成键值对序列,map函数的结果作为reduce函数的参数,reduce函数中再做进一步的统计,比如我的数据集如下:
假如我想查询每位作者所出的书的总价,操作如下:
emit函数主要用来实现分组,接收两个参数,第一个参数表示分组的字段,第二个参数表示要统计的数据,reduce来做具体的数据处理操作,接收两个参数,对应emit方法的两个参数,这里使用了Array中的sum函数对price字段进行自加处理,options中定义了将结果输出的集合,届时我们将在这个集合中去查询数据,默认情况下,这个集合即使在数据库重启后也会保留,并且保留集合中的数据。
查询结果如下:
再比如我想查询每位作者出了几本书,如下:
查询结果如下:
将每位作者的书列出来,如下:
结果如下:
比如查询每个人售价在¥40以上的书:
query表示对查到的集合再进行筛选。
结果如下:
runCommand实现
我们也可以利用runCommand命令来执行MapReduce。格式如下:
含义如下:
参数 含义 mapReduce 表示要操作的集合 map map函数 reduce reduce函数 finalize 最终处理函数 out 输出的集合 query 对结果进行过滤 sort 对结果排序 limit 返回的结果数 scope 设置参数值,在这里设置的值在map、reduce、finalize函数中可见 jsMode 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false verbose 是否显示详细的时间统计信息 bypassDocumentValidation 是否绕过文档验证 collation 其他一些校对
如下操作,表示执行MapReduce操作并对统计的集合限制返回条数,限制返回条数之后再进行统计操作,如下:
执行结果如下:
小伙伴们看到,鲁迅有一本书不见了,就是因为limit是先限制集合返回条数,然后再执行统计操作。
finalize操作表示最终处理函数,如下:
f1第一个参数key表示emit中的第一个参数,第二个参数表示reduce的执行结果,我们可以在f1中对这个结果进行再处理,结果如下:
scope则可以用来定义一个在map、reduce和finalize中都可见的变量,如下:
执行结果如下:
好了,MongoDB中的MapReduce我们就先说到这里,小伙伴们有问题欢迎留言讨论。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对七叶笔记的支持。
参考资料:
1.《MongoDB权威指南第2版》
2.mongodb mapreduce小试
3.mongoDB--mapreduce用法详解(未找到原始出处)