Java and MongoDB use memo 3 - specific instance of aggregation operation group

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

}


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324885427&siteId=291194637