首先简单的谈一下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();