Aggregates in MongoDB are mainly used to process data (such as statistical average, summation, etc.) and return the calculated data results. Somewhat similar to count(*) in SQL statements.
MongoDB's aggregation pipeline processes MongoDB documents in one pipeline and passes the results to the next pipeline for processing. For specific codes, refer to the following example:
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 { /** * set conditions * * @param criteria * @return */ private BasicDBObject setCondition(BmdVisitLogCriteria criteria) { BasicDBObject cond = new BasicDBObject(); if (criteria == null) { return cond; } // time range filter 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); } // conditional filter if (criteria.getName() != null) { cond.put("name", criteria.getName()); } // fuzzy matching filter if (StringUtils.isNotBlank(criteria.getAddress())) { Pattern pattern = Pattern.compile("^.*" + criteria.getAddress() + ".*$", Pattern.CASE_INSENSITIVE); cond.put("address", pattern); } return cond; } /** * Get data based on condition and group by specified column * * @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>(); // Filter data and only output documents that meet the conditions. $match uses MongoDB's standard query operations. BasicDBObject cond = setCondition(criteria); BasicDBObject match = new BasicDBObject("$match", cond); aggreList.add(match); // Group the documents in the collection and count the results. DBObject groupFields = new BasicDBObject("_id", columnName); groupFields.put("count", new BasicDBObject("$sum", 1)); BasicDBObject group = new BasicDBObject("$group", groupFields); aggreList.add(group); // Sort the input documents and output them. BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject( "count", -1)); aggreList.add(sort); // Skip the specified number of documents in the aggregation pipeline and return the remaining documents. if (criteria.getFirstResult() != null) { BasicDBObject skip = new BasicDBObject("$skip", criteria.getFirstResult()); aggreList.add(skip); } // Limit the number of documents returned by the MongoDB aggregation pipeline. if (criteria.getMaximumResultSize() != null) { BasicDBObject limit = new BasicDBObject("$limit", criteria.getMaximumResultSize()); aggreList.add(limit); } // Get the returned result set 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; } }