Spring-Data-MongoDB的Map-Reduce使用

MongoDB Map-Reduce的简介

在MongoDB里,Map-Reduce是聚合操作的一种,与Aggregation Pipline相比,它适合应用于对集合进行多维度且自定义聚合逻辑的查询,并非简单的数值加减乘除,列如某一时间内各个地区的订单(待支付、已付款、交易成功)数量。

先看下MongoDB官方给MapReduce定义的查询语法

db.runCommand(
   {
	 mapReduce: <collection>,
	 map: <function>,
	 reduce: <function>,
	 finalize: <function>,
	 out: <output>,
	 query: <document>,
	 sort: <document>,
	 limit: <number>,
	 scope: <document>,
	 jsMode: <boolean>,
	 verbose: <boolean>,
	 bypassDocumentValidation: <boolean>,
	 collation: <document>,
	 writeConcern: <document>
   }
)

合理地使用mapreducequery参数即可实现大多数统计查询

spring-data-mongodb使用MapReduce

org.springframework.data.mongodb.core.MongoOperations由浅入深提供了3个级别关于MapReduce的接口:

  • mapReduce(String inputCollectionName, String mapFunction, String reduceFunction, Class<T> entityClass);
    最贫瘠的接口,未提供query过滤文档的参数,在应用层面上应该很少有扫描整个Collection的统计需求

  • mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction, Class<T> entityClass);
    中规中矩的接口,符合普罗大众使用习惯的接口,提供了基本的querymapreduce

  • mapReduce(Query query, String inputCollectionName, String mapFunction, String reduceFunction, MapReduceOptions mapReduceOptions, Class<T> entityClass)
    完整体的接口,实现疯狂产品经理的刁钻需求,发挥的空间在参数mapReduceOptions

参数 描述
query 过滤出聚合的文档
mapFunction map函数,spring允许定义的javascript脚本文件放在文件系统、classpath、HTTP服务器或任何其他Spring资源实现上,然后通过一个简单的uri样式语法引用javascript资源,如classpath:xxx/xxx/map.js。把JavaScript代码进行外部化通常更适合将其嵌入到Java代码中。
reduceFunction参考mapFunction
entityClass map-reduce查询结果的POJO的Class

spring-data-mongodb对map、reduce传参