[TOC] ## 概述 语法: ``` db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } ) map 映射函数 (生成键值对序列,作为 reduce 函数参数)。 reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。。 out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。 query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合) sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制 limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大) ``` ![UTOOLS1578278755865.png](https://static.runoob.com/images/map-reduce.bakedsvg.svg) > 注意map 函数是关键把,第一参数为key,第二参数的结果合并为数组 ## 实例 1. 插入数据 ``` db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "mark", "status":"active" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "mark", "status":"active" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "mark", "status":"active" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "mark", "status":"disabled" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "runoob", "status":"disabled" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "runoob", "status":"disabled" }) db.posts.insert({ "post_text": "菜鸟教程,最全的技术文档。", "user_name": "runoob", "status":"active" }) ``` 2.统计: 选取已发布的文章(status:"active"),并通过user\_name分组,计算每个用户的文章数 ``` db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find() ``` 结果 ``` { "_id" : "mark", "value" : 3 } { "_id" : "runoob", "value" : 1 } ``` 3. 统计发布的条数与未发布的条数 ``` db.posts.mapReduce( function() { emit(this.status,1); }, function(key, values) {return Array.sum(values)}, { out:"post_total" } ) ``` 结果 ``` { "_id" : "active", "value" : 4 } { "_id" : "disabled", "value" : 3 } ```