1、普通查询条件
Criteria criteria = new Criteria();
if (status == 2){ // 全部
criteria = Criteria.where("status").ne(StatusEnum.DELETED);
}else if (status == SolitaireConstant.LAUNCH){ // 我发起的
criteria = Criteria.where("userId").is(userId).and("status").ne(StatusEnum.DELETED);
}
Query queryPage = new Query(criteria);
queryPage.with(Sort.by(Sort.Order.desc("createTime"))).skip((long) page.getCurrent() * page.getSize()).limit(page.getSize()); //分页
List<StartSolitaireVO> list = mongoTemplate.find(queryPage, StartSolitaireVO.class,SolitaireConstant.START_SOLITAIRE_COLLECTION);
2、聚合查询(分组、排序、分页、连表)
// 连表
LookupOperation lookup = LookupOperation.newLookup()
// 关联的从表名字
.from(SolitaireConstant.START_SOLITAIRE_COLLECTION)
// 主表中什么字段与从表相关联
.localField("startSolitaireId")
// 从表中的什么字段与主表相关联
.foreignField("_id")
// 自定义的从表结果集名 与主表关联的数据归于此结果集下
.as("startVO");
Criteria criteria = new Criteria();
// 主表可能选择的条件
criteria.and("userId").is(userId);
// 从表可能选择的条件
criteria.and("startVO.status").ne(StatusEnum.DELETED);
// 将筛选条件放入管道中
Aggregation aggregation = Aggregation.newAggregation(
lookup,
Aggregation.match(criteria),
Aggregation.group("startSolitaireId") // 分组的字段
.first("startSolitaireId").as("startSolitaireId") // 映射的字段 并取别名
.first("userId").as("userId")
.first("interact").as("interact")
.first("createTime").as("createTime")
.first("startVO").as("startVO"),
Aggregation.sort(Sort.Direction.DESC,"createTime"), // 排序
Aggregation.skip((long) page.getCurrent() * page.getSize()),
Aggregation.limit(page.getSize())); // 分页
AggregationResults<MySolitaireVO> aggregate = mongoTemplate.aggregate(aggregation, SolitaireConstant.MY_SOLITAIRE_COLLECTION, MySolitaireVO.class);
List<MySolitaireVO> mappedResults = aggregate.getMappedResults();
文章持续更新,可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」第一时间阅读,获取更完整的链路资料。