目前,我有一个问题。我可以使用mongodb中的聚合函数来查询相应的数据,但是在使用springdatamongodb之后,我发现lookup不能使用变量将字符串转换为objectid,所以我应该如何编写这个聚合函数?
如何将它写成mongodb表达式,在spring数据莫加德中使用
db.getCollection('course').aggregate([{
$unwind: '$studentIds',
},
{
$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',
},
}])发布于 2019-12-28 04:10:46
对于复杂的自定义聚合查询,您可以创建一个自定义AggregationOperation,然后从Mongo传递聚合json,或者您拥有的内容。例如:
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));
}
}现在从聚合查询类中传递上面类中的$lookup查询,如下所示:
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());
}
}要获得更多详细信息,您可以在:https://github.com/krishnaiitd/learningJava/blob/master/spring-boot-sample-data-mongodb/src/main/java/sample/data/mongo/services/LookupAggregation.java上查看我的Github
https://stackoverflow.com/questions/59495531
复制相似问题