如何在Spring Data中执行Mongo聚合查询?

这是我第一次在Java中使用Mongo,并且此聚合查询存在一些问题。我可以在Mongo for

Spring中执行一些简单的查询,并@Query在我的Repository接口中扩展注解MongoRepository<T,

ID>。知道在Spring-Data中进行长时间聚合时采用哪种方法会很有帮助。

db.post.aggregate([

{

$match: {}

},

{

$lookup: {

from: "users",

localField: "postedBy",

foreignField: "_id",

as: "user"

}

},

{

$group: {

_id: {

username: "$user.name",

title: "$title",

description: "$description",

upvotes: { $size: "$upvotesBy" },

upvotesBy: "$upvotesBy",

isUpvoted: { $in: [req.query.userId, "$upvotesBy"] },

isPinned: {

$cond: {

if: { $gte: [{ $size: "$upvotesBy" }, 3] },

then: true,

else: false

}

},

file: "$file",

createdAt: {

$dateToString: {

format: "%H:%M %d-%m-%Y",

timezone: "+01",

date: "$createdAt"

}

},

id: "$_id"

}

}

},

{ $sort: { "_id.isPinned": -1, "_id.createdAt": -1 } }

])

回答:

您可以实现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));

}

}

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存储库类:

CustomAggregationOperationLookupAggregation

也使用 MongoTemplate的方法

为您的Model 自定义代码定义一个接口:

interface CustomPostRepository {

List<Post> yourCustomMethod();

}

添加此类的实现并遵循命名约定以确保我们可以找到该类。

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();

}

}

现在,让您的基本存储库界面扩展自定义界面,基础结构将自动使用您的自定义实现:

interface PostRepository extends CrudRepository<Post, Long>, CustomPostRepository {

}

以上是 如何在Spring Data中执行Mongo聚合查询? 的全部内容, 来源链接: utcz.com/qa/399608.html

回到顶部