您可以实现 AggregationOperation 并编写自定义聚合操作查询,然后使用 MongoTemplate 执行您在 mongo shell 中执行的任何 mongo shell 查询,如下所示:
自定义聚合操作
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
public class CustomAggregationOperation implements AggregationOperation {
private String jsonOperation;
public CustomAggregationOperation(String jsonOperation) {
this.jsonOperation = jsonOperation;
}
@Override
public org.bson.Document toDocument(AggregationOperationContext aggregationOperationContext) {
return aggregationOperationContext.getMappedObject(org.bson.Document.parse(jsonOperation));
}
}
任何 Mongo Shell 聚合查询执行器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.stereotype.Service;
import sample.data.mongo.models.Course;
@Service
public class LookupAggregation {
@Autowired
MongoTemplate mongoTemplate;
public void LookupAggregationExample() {
AggregationOperation unwind = Aggregation.unwind("studentIds");
String query1 = "{$lookup: {from: 'student', let: { stuId: { $toObjectId: '$studentIds' } },"
+ "pipeline: [{$match: {$expr: { $eq: [ '$_id', '$$stuId' ] },},}, "
+ "{$project: {isSendTemplate: 1,openId: 1,stu_name: '$name',stu_id: '$_id',},},], "
+ "as: 'student',}, }";
TypedAggregation<Course> aggregation = Aggregation.newAggregation(
Course.class,
unwind,
new CustomAggregationOperation(query1)
);
AggregationResults<Course> results =
mongoTemplate.aggregate(aggregation, Course.class);
System.out.println(results.getMappedResults());
}
}
有关更多详细信息,请查看Github repository 类:CustomAggregationOperation 和 LookupAggregation
其他方法也使用 MongoTemplate:
#1.为模型Post的自定义代码定义一个接口:
interface CustomPostRepository {
List<Post> yourCustomMethod();
}
#2.为这个类添加实现并遵循命名约定以确保我们可以找到这个类。
class CustomPostRepositoryImpl implements CustomPostRepository {
@Autowired
private MongoOperations mongoOperations;
public List<Post> yourCustomMethod() {
// custom match queries here
MatchOperation match = null;
// Group by , Lookup others stuff goes here
// For details: https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/aggregation/Aggregation.html
Aggregation aggregate = Aggregation.newAggregation(match);
AggregationResults<Post> orderAggregate = mongoOperations.aggregate(aggregate,
Post.class, Post.class);
return orderAggregate.getMappedResults();
}
}
#3.现在让您的基础存储库接口扩展自定义接口,基础架构将自动使用您的自定义实现:
interface PostRepository extends CrudRepository<Post, Long>, CustomPostRepository {
}