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"); //查询结果名