前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring-data-mongodb mapreduce使用

spring-data-mongodb mapreduce使用

作者头像
猿天地
发布2018-04-03 12:34:58
2.3K0
发布2018-04-03 12:34:58
举报
文章被收录于专栏:猿天地猿天地

今天主要介绍下在框架中如何使用mapreduce,不涉及到mapreduce的使用讲解

这边主要的js代码都将写在js文件中,放在classpath下面统一维护,修改起来也比较方便,如果直接用字符串拼接的方式在代码中,难看又难维护。

就算不用框架,就用驱动操作mapreduce时,自己也可以将js代码写在xml中,跟mybatis一样,然后写个工具类去读取即可。

代码语言:javascript
复制
MapReduceOptions options = MapReduceOptions.options();
options.outputCollection("Article_MapReduce");
options.outputTypeReduce();
options.finalizeFunction("classpath:finalize.js");
MapReduceResults<ValueObject> reduceResults = 
mongoTemplate.mapReduce("article_info",  
    "classpath:map.js",  
    "classpath:reduce.js", 
    options, 
    ValueObject.class);
reduceResults.forEach(System.out::println);

outputCollection是指将结果输出某个集合中

finalizeFunction是对应的finalize的js函数代码

mapReduce有多个重载方法,下面可以看到有不同的参数,有可以指定输入集合名称的,也有直接传Query的,用Query意味着可以处理符合条件的一些数据,如果不指定Query,那么将处理集合中的所有数据。

代码语言:javascript
复制
mongoTemplate.mapReduce(inputCollectionName, mapFunction, reduceFunction, entityClass)

mongoTemplate.mapReduce(query, inputCollectionName, mapFunction, reduceFunction, entityClass)

mongoTemplate.mapReduce(inputCollectionName, mapFunction, reduceFunction, mapReduceOptions, entityClass)

mongoTemplate.mapReduce(query, inputCollectionName, mapFunction, reduceFunction, mapReduceOptions, entityClass)

前面说到对应的js代码我们是写在文件中,然后调用的时候传这个文件的名称,框架自己回去加载对应的js代码,我们从源码中可以看到有读取js代码的方法。

代码语言:javascript
复制
public <T> MapReduceResults<T> mapReduce(
      Query query, String inputCollectionName, String mapFunction,
      String reduceFunction, MapReduceOptions mapReduceOptions,
      Class<T> entityClass) {

 String mapFunc = replaceWithResourceIfNecessary(mapFunction);
 String reduceFunc = replaceWithResourceIfNecessary(reduceFunction);
代码语言:javascript
复制
protected String replaceWithResourceIfNecessary(String function) {

   String func = function;

   if (this.resourceLoader != null && ResourceUtils.isUrl(function)) {

         Resource functionResource = resourceLoader.getResource(func);

         if (!functionResource.exists()) {
                throw new InvalidDataAccessApiUsageException(
                String.format("Resource %s not found!", function));
          }

          Scanner scanner = null;

          try {
                scanner = new Scanner(functionResource.getInputStream());
                return scanner.useDelimiter("\\A").next();
          } catch (IOException e) {
                throw new InvalidDataAccessApiUsageException(
                String.format("Cannot read map-reduce file %s!",
                 function), e);
          } finally {
                if (scanner != null) {
                    scanner.close();
                }
          }
      }

      return func;
}

下面贴出今天测试的js代码,按文章的作者统计文章的次数

map.js

代码语言:javascript
复制
function() {
    emit(this.author,1);
}

reduce.js

代码语言:javascript
复制
function(key,values) {
    var sum = 0;
    for (var i = 0; i < values.length; i++)
        sum += values[i];
    return sum;
}

finalize.js

代码语言:javascript
复制
function(key,reduce) {
    return reduce;
}

finalize中没有去格式化输出的格式,所以输出的格式是原始的格式

代码语言:javascript
复制
{ "_id" : "文章作者", "value" : 文章次数 }

上面的调用代码中虽然指定了输出结果的集合名称,但还是定义了ValueObject来接收返回值, 那么ValueObject的格式肯定也是id和value。

代码语言:javascript
复制
public class ValueObject {
    private String id;
    private Integer value;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Integer getValue() {
        return value;
    }
    public void setValue(Integer value) {
        this.value = value;
    }
    @Override
    public String toString() {
       return "ValueObject 
       [id=" + id + ", value=" + value + "]";
    }
}

在库中查询的原始数据格式如下

代码语言:javascript
复制
> db.Article_MapReduce.find();
{ "_id" : "jason", "value" : 1 }
{ "_id" : "mk", "value" : 1 }
{ "_id" : "yinjihuan", "value" : 18 }
> 
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • map.js
  • reduce.js
  • finalize.js
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档