MongoDB   发布时间:2022-05-23  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了调戏data mongodb 之 mapreduce大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

《调戏data mongodb 之 mapreduce》要点:
本文介绍了调戏data mongodb 之 mapreduce,希望对您有用。如果有疑问,可以联系我们。@H_262_4@

《调戏data mongodb 之 mapreduce》是否对您有启发,欢迎查看更多与《调戏data mongodb 之 mapreduce》相关教程,学精学透。编程之家php学院为您提供精彩教程。

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

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

@H_136_6@mapReduceOptions options = MapReduceOptions.options();

options.outputCollection("Article_MapReduce");

options.outputTypeReduce();

options.finalizefunction("classpath:finalize.Js");

@H_136_6@mapReduceResults<ValueObject> reduceResults =

@H_136_6@mongoTemplate.mapReduce("article_info","classpath:map.Js",

"classpath:reduce.Js",options,ValueObject.class);

reduceResults.forEach(System.out::println);

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

finalizefunction是对应的finalize的Js函数代码

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

@H_136_6@mongoTemplate.mapReduce(inputCollectionname,mapFunction,

reduceFunction,entityClass)

@H_136_6@mongoTemplate.mapReduce(query,inputCollectionname,

@H_136_6@mapFunction,reduceFunction,entityClass)

@H_136_6@mongoTemplate.mapReduce(inputCollectionname,mapReduceOptions,entityClass)

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

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);

DBCollection inputCollection = getCollection(inputCollectionName);

@H_136_6@mapReduceCommand command = new MapReduceCommand(inputCollection,mapFunc,reduceFunc,

@H_136_6@mapReduceOptions.getoutputCollection(),mapReduceOptions.getoutputType(),

query == null || query.getqueryObject() == null ? null

: querymapper.getMappedobject(query.getqueryObject(),null));

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代码,按文章的作者统计文章的次数

@H_511_1@map.Js

function() {

emit(this.author,1);

}

reduce.Js

function(key,values) {

var sum = 0;

for (var i = 0; i < values.length; i++)

sum += values[i];

return sum;

}

finalize.Js

function(key,reducE) {

return reduce;

}

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

{ "_ID" : "文章作者","value" : 文章次数 }

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

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 + "]";

}

}

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

> db.Article_MapReduce.find();

{ "_ID" : "jason","value" : 1 }

{ "_ID" : "mk","value" : 1 }

{ "_ID" : "yinjihuan","value" : 18 }

>

源码下载:https://github.com/yinjihuan/cxytiandi

大佬总结

以上是大佬教程为你收集整理的调戏data mongodb 之 mapreduce全部内容,希望文章能够帮你解决调戏data mongodb 之 mapreduce所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: