mongodb聚合查询

Posted by Clear Blog on June 12, 2017

首先简单的谈一下mongodb,我个人觉得它的优点就是schemaless,不需要对象关系映射(ORM),性能非常好, 但是现在的云服务上,内存型数据库的费用是极其昂贵的,再者关联查询是非常麻烦的。 我不要求它有事务或者触发器这些等等,如果需要,我宁愿选择关系型db。

经验之谈:app中有送礼需求的,都会相应的出个恩爱榜,排行榜这样的需求。

我们将送礼记录存在了mongodb中,记录送礼方用户userId收礼方用户tid送礼总消耗金币gold以及其他一些相关字段。

恩爱榜就是要以收礼人tuid为条件做聚合查询对gold做求和操作,然后取出前N名,按消费金币排序。

以下是我在springboot项目中的代码,因为mongo本身是内存型数据库,所以查询的结果也无需再存储到redis中,查询效率很高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
	
 Aggregation aggregation;
 if (fuid != null) {
 aggregation = Aggregation.newAggregation(
       match(Criteria.where("tuid").is(tuid).andOperator(Criteria.where("userId").is(fuid))),
       group("userId").sum("gold").as("totalGold"),
       sort(Sort.Direction.DESC, "totalGold"), limit(defenderCount));
 } else {
       aggregation = Aggregation.newAggregation(
       match(Criteria.where("tuid").is(tuid)),
       group("userId").sum("gold").as("totalGold"),
       sort(Sort.Direction.DESC, "totalGold"), limit(defenderCount));
 }
 AggregationResults<SimpleDefenderModel> ar = mongoTemplate.aggregate(aggregation, "gifuser", SimpleDefenderModel.class);
 List<SimpleDefenderModel> simpleDefenderModels = ar.getMappedResults();