Java与MongoDB的配合使用备忘3-聚合操作group具体实例

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,具体代码参考以下示例:

package com.mongodb.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.bson.Document;
import org.springframework.stereotype.Repository;

import com.mongodb.MongoDBTemplate;
import com.mongodb.MongodbBaseDaoImpl;
import com.mongodb.OperatorName;
import com.mongodb.dao.BmdVisitLogDao;
import com.mongodb.support.VisitLogCriteria;
import com.mongodb.vo.VisitLogGroupedVo;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;

@Repository("visitLogDao")
public class VisitLogDaoImpl extends MongodbBaseDaoImpl implements VisitLogDao {

	/**
	 * 设置条件
	 * 
	 * @param criteria
	 * @return
	 */
	private BasicDBObject setCondition(BmdVisitLogCriteria criteria) {
		BasicDBObject cond = new BasicDBObject();
		if (criteria == null) {
			return cond;
		}
		// 时间范围筛选
		if (criteria.getStartDate() != null || criteria.getEndDate() != null) {
			BasicDBObject obj = null;
			if (criteria.getStartDate() != null) {
				obj = new BasicDBObject("$gte", criteria
						.getStartDate().getTime());
			}
			if (criteria.getEndDate() != null) {
				obj = obj != null ? obj.append("$lte", criteria
						.getEndDate().getTime()) : new BasicDBObject(
						OperatorName.lte, criteria.getEndDate().getTime());
			}
			cond.put("dateAdded", obj);
		}
		// 条件筛选
		if (criteria.getName() != null) {
			cond.put("name", criteria.getName());
		}
		// 模糊匹配筛选
		if (StringUtils.isNotBlank(criteria.getAddress())) {
			Pattern pattern = Pattern.compile("^.*" + criteria.getAddress() + ".*$",
					Pattern.CASE_INSENSITIVE);
			cond.put("address", pattern);
		}
		return cond;
	}

	/**
	 * 根据条件获取数据并根据指定列分组
	 * 
	 * @param siteId
	 * @param criteria
	 * @param columnName
	 * @return
	 */
	@Override
	public List<VisitLogGroupedVo> groupByColumn(Integer siteId, VisitLogCriteria criteria, String columnName) {
		if(StringUtils.isBlank(columnName)) return null;
		MongoCollection<Document> dbCollection = MongoDBTemplate.getMongoDBTemplate().getCollection("you table name");
		List<BasicDBObject> aggreList = new ArrayList<BasicDBObject>();
		// 过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
		BasicDBObject cond = setCondition(criteria);
		BasicDBObject match = new BasicDBObject("$match", cond);
		aggreList.add(match);
		
		// 将集合中的文档分组,统计结果。
		DBObject groupFields = new BasicDBObject("_id", columnName);
		groupFields.put("count", new BasicDBObject("$sum", 1));
		BasicDBObject group = new BasicDBObject("$group", groupFields);
		aggreList.add(group);
		// 将输入文档排序后输出。
		BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject(
				"count", -1));
		aggreList.add(sort);
		// 在聚合管道中跳过指定数量的文档,并返回余下的文档。
		if (criteria.getFirstResult() != null) {
			BasicDBObject skip = new BasicDBObject("$skip", criteria.getFirstResult());
			aggreList.add(skip);
		}
		// 限制MongoDB聚合管道返回的文档数。
		if (criteria.getMaximumResultSize() != null) {
			BasicDBObject limit = new BasicDBObject("$limit", criteria.getMaximumResultSize()); 
			aggreList.add(limit);
		}
		
		// 获取返回的结果集
		AggregateIterable<Document> docIterable = dbCollection.aggregate(aggreList);
		List<VisitLogGroupedVo> list = new ArrayList<VisitLogGroupedVo>();
		for (Document doc : docIterable) {
			vo.setColumnName(doc.getString("_id"));
			vo.setCount(doc.getInteger("count"));
			list.add(vo);
		}
		return list;
	}

}


猜你喜欢

转载自blog.csdn.net/nangongyanya/article/details/72911449
今日推荐