java-mongodo-1

本文详细介绍了MongoDB中聚合框架的使用方法,包括基本聚合查询、复杂聚合管道操作及Spring Data MongoDB的聚合函数应用。通过具体示例展示了如何进行数据统计、分组、排序等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;

public class MongoDBJDBC{
   public static void main( String args[] ){
      try{   
//       // 连接到 mongodb 服务
//         MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
//       
//         // 连接到数据库
//         MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");  
//         System.out.println("Connect to database successfully");
          
          Mongo m = new Mongo("localhost", 27017);
          DB db = m.getDB("test");
          DBCollection coll = db.getCollection("mycoll");
           
          /*创建 $match, 作用相当于query*/
          DBObject match = new BasicDBObject("$match", new BasicDBObject("province", "上海"));
           
          /* Group操作*/
          DBObject groupFields = new BasicDBObject("_id", "$province");
          groupFields.put("AvgAge", new BasicDBObject("$avg", "$age"));
          DBObject group = new BasicDBObject("$group", groupFields);
           
          /* 查看Group结果 */
          AggregationOutput output = coll.aggregate(match, group); // 执行 aggregation命令
          System.out.println(output.results());

          
          /* 创建 $unwind 操作, 用于切分数组*/
//          DBObject unwind = new BasicDBObject("$unwind", "$subjects");
                  
          /* Group操作*/
//          DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("subjname", "$subjects.name").append("province", "$province"));
//          groupFields.put("AvgScore", new BasicDBObject("$avg", "$subjects.score"));
//          DBObject group = new BasicDBObject("$group", groupFields);
                  
          /* Reshape Group Result*/
//          DBObject projectFields = new BasicDBObject();
//          projectFields.put("province", "$_id.province");
//          projectFields.put("subjinfo", new BasicDBObject("subjname","$_id.subjname").append("avgscore", "$AvgScore"));
//          DBObject project = new BasicDBObject("$project", projectFields);
//                  
          /* 将结果push到一起*/
//          DBObject groupAgainFields = new BasicDBObject("_id", "$province");
//          groupAgainFields.put("avginfo", new BasicDBObject("$push", "$subjinfo"));
//          DBObject reshapeGroup = new BasicDBObject("$group", groupAgainFields);
            
//          /* 查看Group结果 */
//          AggregationOutput output = coll.aggregate(unwind, group, project, reshapeGroup);
//          System.out.println(output.results());

//        
      }catch(Exception e){
        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
     }
   }
}
	<dependencies>
		<dependency>
			<artifactId>junit</artifactId>
			<groupId>junit</groupId>
			<version>4.11</version>
		</dependency>

		<dependency>
			<artifactId>mongo-java-driver</artifactId>
			<groupId>org.mongodb</groupId>
			<version>3.2.2</version>
		</dependency>
	</dependencies>

记录mongodb聚合基本查询方式。

1.mongodb基本操作
2.使用聚合函数进行统计
3.好像是过期方法

另一种方式:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
	@Test
	public void testAggreate() {
		Aggregation agg = newAggregation(
			    //project("tags"),
			 //   unwind("tags"),
			    Aggregation.group("merchantNo").sum("amt").as("n"),
			   // project("n").and("tag").previousOperation(),
			    sort(Direction.DESC, "n")
			);

			AggregationResults<Map> results = mongoTemplate.aggregate(agg, "order-info", Map.class);
			List<Map> tagCount = results.getMappedResults();
			System.out.println(tagCount);
	}
	

 

	public Integer sumAmt(OrderLog orderLog) {
		Criteria criteria = Criteria.where("id").gt(0);
		criteria.and("merchantNo").is(orderLog.getMerchantNo());
		if (orderLog.getCreateTime() != null && orderLog.getModifyTime() != null) {
			criteria.and("createTime").lte(orderLog.getModifyTime()).gte(orderLog.getCreateTime());
		}
		criteria.and("tradeState").lte(10);
		MatchOperation match = Aggregation.match(criteria);
		GroupOperation group = Aggregation.group().sum("amt").as("total");
		// ProjectionOperation project = Aggregation.project().andInclude("total");
		Aggregation aggregation = Aggregation.newAggregation(match, group);
		AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "order-info", Map.class);

		// Aggregation aggregation3 =
		// Aggregation.newAggregation().count("").as("value"));

		// GroupBy groupBy =
		// GroupBy.key(mongoQueryVo.getTarget()).initialDocument("{value:0}")
		// .reduceFunction("function(doc,prev){prev.value+=1}");
		// GroupByResults<BasicDBObject> groupByResults =
		// mongoTemplate.group(criteria,"order-info",groupBy,BasicDBObject.class);
		System.out.println(results.getMappedResults().size());
		System.out.println(results.getRawResults());
		System.out.println(results.getUniqueMappedResult());

		long total = 0l;
		String reduce = "function(doc, aggr){" + 
						"            aggr.total += doc.amt;" + 
						"        }";

		Query query = Query.query(Criteria.where("merchantNo").is(orderLog.getMerchantNo()));

		DBObject result = mongoTemplate.getCollection("order-info").group(new BasicDBObject(),
				query.getQueryObject(), new BasicDBObject("total", total), reduce);
		Map<String, BasicDBObject> map = result.toMap();
		System.out.println(map);
		if (map.size() > 0) {
			BasicDBObject bdbo = map.get("0");
			if (bdbo != null && bdbo.get("total") != null)
				total = bdbo.getLong("total");
		}
		System.out.println(total);

		return 100;
	}

第三种方式:

@Test
	public void testGroup() {
		
		Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("selectCourse").is("599bc8be5ae9fb99b2ca2498")),
                Aggregation.project("courses"),
                Aggregation.unwind("courses"),
                Aggregation.group("courses").count().as("count"),
                Aggregation.project("count").and("courses").previousOperation(),
                Aggregation.sort(Sort.Direction.DESC, "count")
                );
        AggregationResults<SubjectCount> groupResults = mongoTemplate.aggregate(agg, "test", SubjectCount.class);
        List<SubjectCount> subjectCounts = groupResults.getMappedResults();

        Map<String, Long> subjectCountMap = subjectCounts.stream().collect(Collectors.toMap(t -> t.getCourses(), t -> t.getCount()));
		
        System.out.println(subjectCountMap);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值