db.getCollection('com.sup.pojo.Table').mapReduce(
function(){ //map
emit(this.instanceId,this.rent);
},
function(keys,values){ //redus
var arr = new Array(values.length);
print(values.length);
var length2 = values.length;
for(i=0;i<length2;i++ ){
arr[i]=NumberInt(values[i]);
}
return Array.sum(arr);
},
{
/*指定结果集以什么方式存储,可选参数包括:
replace:如果文档(table)存在,则替换table,
merge:如果文档中存在记录,则覆盖已存在的文档记录
reduce: 如果文档中存在相同key的记录了,则先计算两条记录,然后覆盖旧记录
{inline:1} 在内存中存储记录,不写入磁盘(用户数据量少的计算) */
out:"rent_tatal",
//筛选条件
query: { signingTime: { $gt: "2019-01-01", $lt: "2019-01-31" }}
}
).find();
map: function() {emit(this.cat_id,this.goods_number); }, // 函数内部要调用内置的emit函数,cat_id代表根据cat_id来进行分组,goods_number代表把文档中的goods_number字段映射到cat_id分组上的数据,其中this是指向向前的文档的,这里的第二个参数可以是一个对象,如果是一个对象的话,也是作为数组的元素压进数组里面;
reduce: function(cat_id,all_goods_number) {return Array.sum(all_goods_number)}, // cat_id代表着cat_id当前的这一组,all_goods_number代表当前这一组的goods_number集合,这部分返回的就是结果中的value值;
out: , // 输出到某一个集合中,注意本属性来还支持如果输出的集合如果已经存在了,那是替换,合并还是继续reduce? 另外还支持输出到其他db的分片中,具体用到时查阅文档,筛选出现的键名分别是_id和value;
query: , // 一个查询表达式,是先查询出来,再进行mapReduce的
sort: , // 发往map函数前先给文档排序
limit: , // 发往map函数的文档数量上限,该参数貌似不能用在分片模式下的mapreduce
finalize: function(key, reducedValue) {return modifiedObject; }, // 从reduce函数中接受的参数key与reducedValue,并且可以访问scope中设定的变量
scope: , // 指定一个全局变量,能应用于finalize和reduce函数
jsMode: , // 布尔值,是否减少执行过程中BSON和JS的转换,默认true,true时BSON–>js–>map–>reduce–>BSON,false时 BSON–>JS–>map–>BSON–>JS–>reduce–>BSON,可处理非常大的mapreduce。
verbose: // 是否产生更加详细的服务器日志,默认true