首页>代码>java mongodb多个collection表进行mapreduce的查询实例>/mapreduce/src/main/java/com/main/MapReduceTest.java
package com.main;

import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Random;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MapReduceCommand;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

public class MapReduceTest {

	private Mongo mongo = null;
	private DB db = null;

	@Before
	public void init() {
		try {
			mongo = new Mongo("localhost");
			db = mongo.getDB("stat");
			initData();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (MongoException e) {
			e.printStackTrace();
		}
	}

	/**
	 * map reduce for today
	 */
	@Test
	public void dayMapReduce() {
		String map = " function() {emit(this.videoid,this.play)}";
		String reduce = "function(key,values) {var count = 0;values.forEach(function(value){count += value;});return count;}";
		Calendar calendar = Calendar.getInstance();
		String datePattern = "yyyy-MM";
		SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
		String monthOfYear = sdf.format(calendar.getTime());
		for (int day = 1; day <= 31; day++) {
			String collectionName = monthOfYear + "-" + day;
			DBCollection collection = db.getCollection(collectionName);
			collection
					.mapReduce(map, reduce, collectionName + "_daystat", null);
		}
	}

	/**
	 * map reduce for current month
	 */
	@Test
	public void monthMapReduce() {
		// do day mapreduce before month mapreduce
		dayMapReduce();
		String map = " function() {emit(this._id,this.value)}";
		String reduce = "function(key,values) {var count = 0;values.forEach(function(value){count += value;});return count;}";
		Calendar calendar = Calendar.getInstance();
		String datePattern = "yyyy-MM";
		SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
		String monthOfYear = sdf.format(calendar.getTime());
		for (int day = 1; day <= 31; day++) {
			String collectionName = monthOfYear + "-" + day + "_daystat";
			DBCollection collection = db.getCollection(collectionName);
			MapReduceCommand cmd = new MapReduceCommand(collection, map,
					reduce, monthOfYear + "_monthstat",
					MapReduceCommand.OutputType.REDUCE, null);
			collection.mapReduce(cmd);
		}
	}

	private void initData() {
		db.dropDatabase();
		Calendar calendar = Calendar.getInstance();
		String datePattern = "yyyy-MM";
		SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
		String monthOfYear = sdf.format(calendar.getTime());
		for (int day = 1; day <= 31; day++) {
			String collectionName = monthOfYear + "-" + day;
			DBCollection collection = db.getCollection(collectionName);
			for (int j = 1; j <= 100; j++) {
				DBObject play = new BasicDBObject();
				play.put("videoid", new Random().nextInt(100));
				play.put("play", new Random().nextInt(1000));
				collection.insert(play);
			}
		}
	}

	@After
	public void destory() {
		if (mongo != null)
			mongo.close();
		mongo = null;
		db = null;
	}
}
最近下载更多
renjialu7  LV4 2020年12月28日
oppoposwsdf  LV1 2020年6月2日
zhanggy007  LV1 2020年5月13日
xiao_ma  LV1 2019年12月19日
海水有点甜  LV2 2019年12月12日
wzw1234567  LV2 2019年6月4日
hxt18157146539  LV2 2019年5月21日
skylar_running  LV2 2019年5月17日
lijunable  LV1 2019年4月22日
489472910  LV1 2019年3月26日
最近浏览更多
zjba21314 2022年1月18日
暂无贡献等级
smilewgx  LV5 2021年10月17日
170751967  LV5 2021年7月3日
sunlzh888888  LV28 2021年6月24日
liuhao_  LV2 2021年6月10日
阳止初四  LV8 2021年6月6日
chapter06 2021年4月7日
暂无贡献等级
xsxtxbb  LV8 2021年3月9日
微冷的早上  LV1 2021年1月2日
藏楽想赚钱  LV2 2020年12月30日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友