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