LookupOperation lookupOperation= LookupOperation.newLookup().
from(AdminRepository.instance().getTableName()). //关联从表名
localField(User.Fields.name). //主表关联字段
foreignField(Admin.Fields.name).//从表关联的字段
as("adminInfo"); //查询结果名
Criteria left = Criteria.where(User.Fields.city).exists(true)
.andOperator(Criteria.where(User.Fields.age).gte(18),
Criteria.where(User.Fields.age).lt(65));
Criteria right = Criteria.where("adminInfo.0").exists(true).and("adminInfo.0.admin").is(1);
GroupOperation group = Aggregation.group(User.Fields.city).first(User.Fields.age).as("firstAge")
.avg(User.Fields.age).as("avgAge").addToSet(User.Fields.age).as("ageList")
.count().as("count").max(User.Fields.age).as("maxAge")
.push(User.Fields.age).as("ageField");
ProjectionOperation projectionOperation = Aggregation.project("_id")
.and("adult").applyCondition(ConditionalOperators.Cond.when(Criteria.where("firstAge").gt(12))
.then(1).otherwise(0));
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(left), lookupOperation,
Aggregation.match(right), Aggregation.unwind("adminInfo", true), group,
projectionOperation);
List<Map> results = this.getMongoOperations().aggregate(aggregation, this.getTableName(), Map.class).getMappedResults();
一、聚合
(1)匹配
Aggregation.match(left)
(2)分组
GroupOperation group = Aggregation.group(User.Fields.city).first(User.Fields.age).as("age")
.avg(User.Fields.age).as("avgAge").addToSet(User.Fields.age).as("ageList")
.count().as("count").max(User.Fields.age).as("maxAge")
.push(User.Fields.age).as("ageField");
(3)投影
ProjectionOperation projectionOperation = Aggregation.project("_id")
.and("adult").applyCondition(ConditionalOperators.Cond.when(Criteria.where("firstAge").gt(12))
.then(1).otherwise(0));
(4)扁平化数组
Aggregation.unwind("adminInfo", true)
二、连接
LookupOperation lookupOperation= LookupOperation.newLookup().
from(AdminRepository.instance().getTableName()). //关联从表名
localField(User.Fields.name). //主表关联字段
foreignField(Admin.Fields.name).//从表关联的字段
as("adminInfo"); //查询结果名