目录javascript
Map-reduce是一种数据处理范例,用于将大量数据压缩为有用的聚合结果。 对于map-reduce操做,MongoDB提供了mapReduce数据库命令。
一个简单的map-reduce
示例以下:html
在此map-reduce
操做中,MongoDB将映射(map)
操做应用于每一个输入文档(即集合中与查询条件匹配的文档)。map函数提交(emit)一个键值对(key-value)。对于具备多个值的key钥,MongoDB应用reduce
操做,该操做用于聚合数据。而后MongoDB将结果存储在一个集合
中。reduce函数的输出还能够选择经过finalize
函数以进一步压缩或处理聚合的结果。java
MongoDB中的全部map-reduce函数都是JavaScript,并在mongod进程中运行。 Map-reduce操做将单个集合的文档做为输入,并可在开始映射阶段以前执行任意排序和限制。 mapReduce能够将map-reduce操做的结果做为文档返回,也能够将结果写入集合。 输入和输出集合能够分片。mongodb
对于大多数聚合操做,聚合管道( Aggregation Pipeline)[https://docs.mongodb.com/manual/core/aggregation-pipeline/]提供更好的性能和更一致的接口。 可是,map-reduce操做提供了一些目前在聚合管道中不可用的灵活性。数据库
在MongoDB中,map-reduce操做使用自定义JavaScript函数将值(value)映射或关联到键(key)。 若是某个键(key)有对应多个值(value),则该操做应该将键的值reduces
为单个对象。json
使用自定义JavaScript函数能够灵活地进行map-reduce操做。 例如,在处理文档时,map函数能够建立多个键和值映射或不进行映射。 Map-reduce操做还可使用自定义JavaScript函数对映射的结果进行最终修改,并在映射操做的最后阶段进行reduce操做,执行其余计算。函数
在MongoDB中,map-reduce操做能够将结果写入集合或返回结果内联。 若是将map-reduce输出写入集合,则能够在合并替换,合并或减小新结果与先前结果的同一输入集合上执行后续map-reduce操做。 有关详细信息和示例,请参阅mapReduce和Perform Incremental(执行增量) Map-Reduce。性能
当返回map-reduce操做的内联结果时,结果文档必须在BSON文档大小限制内,该限制当前为16兆字节。 有关map-reduce操做的限制和限制的其余信息,请参阅mapReduce参考页面。测试
MongoDB支持分片集合上的map-reduce操做。 Map-reduce操做还能够将结果输出到分片集合。 请参见Map-Reduce and Sharded Collections。this
Views(视图)不支持map-reduce操做。
MongoDB地理空间数据存储及检索
上面连接是以前曾经作过一个全国县级行政边界矢量入库到MongoDB的记录,这里用它来测试一下。
简单的测试一下全国每一个省都有多少个县
db.getCollection('xzbj').mapReduce( function() { emit(this.properties.sheng,1);}, function(key,values){return Array.sum(values);}, { query:{}, out:"xian_count" } )
这里将结果输出到了xian_count
这个新的集合中,能够打开这个集合查看结果。
上面的query
也能够没有,就是默认集合内所有文档。
若是不想把结果输出到一个集合,直接显示结果,则可使用out: { inline: 1 }
。
计算一下湖南省每一个地级市有多少个县
使用下面语句
db.getCollection('xzbj').mapReduce( function() { emit(this.properties.di,1);}, function(key,values){return Array.sum(values);}, { query:{ 'properties.sheng':'湖南'}, out: { inline: 1 } } )
获得输出以下(这里若是是针对全国的数据是有问题的,由于以前没有正确处理港澳台数据):
{ "results" : [ { "_id" : "娄底市", "value" : 5.0 }, { "_id" : "岳阳市", "value" : 7.0 }, { "_id" : "常德市", "value" : 9.0 }, { "_id" : "张家界市", "value" : 3.0 }, { "_id" : "怀化市", "value" : 12.0 }, { "_id" : "株洲市", "value" : 6.0 }, { "_id" : "永州市", "value" : 10.0 }, { "_id" : "湘潭市", "value" : 4.0 }, { "_id" : "湘西土家族苗族自治州", "value" : 8.0 }, { "_id" : "益阳市", "value" : 6.0 }, { "_id" : "衡阳市", "value" : 8.0 }, { "_id" : "邵阳市", "value" : 11.0 }, { "_id" : "郴州市", "value" : 11.0 }, { "_id" : "长沙市", "value" : 5.0 } ], "timeMillis" : 19.0, "counts" : { "input" : 105, "emit" : 105, "reduce" : 14, "output" : 14 }, "ok" : 1.0, "_o" : { "results" : [ { "_id" : "娄底市", "value" : 5.0 }, { "_id" : "岳阳市", "value" : 7.0 }, { "_id" : "常德市", "value" : 9.0 }, { "_id" : "张家界市", "value" : 3.0 }, { "_id" : "怀化市", "value" : 12.0 }, { "_id" : "株洲市", "value" : 6.0 }, { "_id" : "永州市", "value" : 10.0 }, { "_id" : "湘潭市", "value" : 4.0 }, { "_id" : "湘西土家族苗族自治州", "value" : 8.0 }, { "_id" : "益阳市", "value" : 6.0 }, { "_id" : "衡阳市", "value" : 8.0 }, { "_id" : "邵阳市", "value" : 11.0 }, { "_id" : "郴州市", "value" : 11.0 }, { "_id" : "长沙市", "value" : 5.0 } ], "timeMillis" : 19, "counts" : { "input" : 105, "emit" : 105, "reduce" : 14, "output" : 14 }, "ok" : 1.0 }, "_keys" : [ "results", "timeMillis", "counts", "ok" ], "_db" : { "_mongo" : { "slaveOk" : true, "host" : "127.0.0.1:27017", "defaultDB" : "test", "_readMode" : "commands" }, "_name" : "us" } }