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