在SPRING DATA MONGODB中使用聚合统计查询
2016-09-22 14:47
609 查看
</pre><p>在SQL语句中如要做统计一般是这种方式</p><p></p><pre name="code" class="sql">SELECT ..,SUM(1) FROM .. WHERE .. GROUP BY .. HAVING .. SORT ..
在MONGODB中的架构图:
在SPRING DATA MONGODB中是这样写的:
public class VideoRepositoryImpl implements VideoRepositoryCustom{ private static Logger logger = LoggerFactory.getLogger(VideoRepositoryImpl.class); @Autowired private MongoTemplate mongoTemplate; public List<Cat1UpdateCount> getVideoWithUpdateFrag(List<String> importantCat1List) { logger.info(new Date().toString()); /** * db.videos.aggregate( [ { $match: { "frags.isnew" : true } }, { $unwind: "$frags" }, { $match: { "frags.isnew" : true } }, { $group: { _id: {cat1:"$cat1"}, count: { $sum: 1 }, publishdate2: { $max: "$publishdate"} } } ] ) */ Aggregation agg = newAggregation( project("frags","cat1","publishdate"),//挑选所需的字段 match( Criteria.where("frags.isnew").is(Boolean.TRUE) .and("cat1").in(importantCat1List) ),//筛选符合条件的记录 unwind("frags"),//如果有MASTER-ITEM关系的表,需同时JOIN这两张表的,展开子项LIST,且是内链接,即如果父和子的关联ID没有的就不会输出 match(Criteria.where("frags.isnew").is(Boolean.TRUE)), group("cat1")//设置分组字段 .count().as("updateCount")//增加COUNT为分组后输出的字段 .last("publishdate").as("publishDate"),//增加publishDate为分组后输出的字段 project("publishDate","cat1","updateCount")//重新挑选字段 .and("cat1").previousOperation()//为前一操作所产生的ID FIELD建立别名 ); AggregationResults<Cat1UpdateCount> results = mongoTemplate.aggregate(agg, Video.COLLECTION_NAME, Cat1UpdateCount.class); List<Cat1UpdateCount> cat1UpdateCountList = results.getMappedResults(); return cat1UpdateCountList; } }
其中frags的数据类型是LIST
Cat1UpdateCount.java
import java.io.Serializable; public class Cat1UpdateCount implements Serializable{ private static final long serialVersionUID = 4240876746984930098L; private String cat1; private int updateCount; private String publishDate; public String getCat1() { return cat1; } public void setCat1(String cat1) { this.cat1 = cat1; } public int getUpdateCount() { return updateCount; } public void setUpdateCount(int updateCount) { this.updateCount = updateCount; } public String getPublishDate() { return publishDate; } public void setPublishDate(String publishDate) { this.publishDate = publishDate; } public String toString() { return "Cat1UpdateCount [cat1=" + cat1 + ", updateCount=" + updateCount + ", publishDate=" + publishDate + "]"; } }
案例:
public class ForbiddingUser { private long uid; private Date deadline; public long getUid() { return uid; } public ForbiddingUser setUid(long uid) { this.uid = uid; return this; } public Date getDeadline() { return deadline; } public ForbiddingUser setDeadline(Date deadline) { this.deadline = deadline; return this; } }
public List<ForbiddingUser> findForbiddingUserId(String scopeCode, long tenant) { String collectionName = mongoOperations.getCollectionName(UserRecord.class); Aggregation aggregation = newAggregation( match(where("deadline").gt(new Date()) .and("tenant").is(tenant) .and("scopeCode").is(scopeCode)), project("uid", "deadline") ); AggregationResults<ForbiddingUser> results = mongoOperations.aggregate( aggregation, collectionName, ForbiddingUser.class); return results.getMappedResults();
案例:
@Override public int countForbidUserAmount(Date begin, Date end, Set<String> scopeCodes, long tenant) { Aggregation aggregation = newAggregation( match(where("tenant").is(tenant) .and("scopeCode").in(scopeCodes) .andOperator(where("time").gte(begin), where("time").lte(end))), project("uids"), unwind("uids"), group("uids"), MongoUtils.aggregationCount() ); AggregationResults<Map> results = mongoOperations.aggregate( aggregation, getForbidCollection(), Map.class); return MongoUtils.parseAggregationCount(results); }
相关文章推荐
- 在SPRING DATA MONGODB中使用聚合统计查询
- 在SPRING DATA MONGODB中使用聚合统计查询
- Mongodb系列- spring-data-mongodb使用MongoTemplate实现分页查询
- dubbo服务使用spring-data-mongodb进行时间查询的bug记录
- 使用Spring Data MongoDB 做聚合操作出现的问题及解决方案
- 使用spring data api查询分组中的mongodb最大值
- spring data mongodb高级查询语句的使用(网上基本没资料)
- Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计
- Spring Data MongoDB 基础查询
- spring-data-mongodb的同字段索引多条件查询
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)
- 拥抱NoSQL--谈Spring Data MongoDB的简单使用
- Spring Data MongoDB 模糊查询
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
- MongoDB的使用学习之(七)MongoDB的聚合查询(spring-data-mongodb两种方式)附项目源码
- Spring Data 与MongoDB 集成四:操作篇(查询)
- Spring Data MongoDB 模糊查询
- Spring Data MongoDB 三:基本文档查询(query、BasicQuery)
- spring data jpa .基本使用,多条件复合查询,报表查询。
- Spring data JPA中使用Specifications动态构建查询