我有一个聚合管道,其中包含如下项目:
$project: {
start: {
$cond: {
if: {
$eq: ["$start", "EARLY"]
},
then: "$deltastart.start",
else: "$deltastart.end"
}
},...
},...它在mongo shell中工作得很好。如何使用Spring-Mongodb中的聚合框架来表达这一点?我见过ProjectionOperationBuilder、ExpressionProjectionOperationBuilder类型,但没有举例说明如何使用它们……有什么建议吗?
发布于 2015-03-22 02:38:35
如果使用当前通过$project管道支持运算符的Spring Data发行版,则可以将其转换为(未测试):
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.*;
import org.springframework.data.mongodb.core.query.Criteria;
Cond condOperation = ConditionalOperators.when(Criteria.where("start").is("EARLY"))
.thenValueOf("deltastart.start")
.otherwise("deltastart.end");
Aggregation agg = newAggregation(project().and(condOperation).as("start"));
AggregationResults<MyClass> results = mongoTemplate.aggregate(agg, MyClass.class);
List<MyClass> myList = results.getMappedResults();对于在聚合操作中不支持运算符的Spring-Data MongoDB版本,有一个变通方法是实现接口以接受DBObject:
public class CustomProjectAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomProjectAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}然后,将$project操作作为聚合管道中的DBObject实现,该聚合管道与您拥有的聚合管道相同:
DBObject operation = (DBObject) new BasicDBObject(
"$project", new BasicDBObject(
"start", new BasicDBObject(
"$cond", new Object[]{
new BasicDBObject(
"$eq", new Object[]{ "$start", "EARLY"}
),
"$deltastart.start",
"$deltastart.end"
}
)
)
);然后您可以在TypeAggregation中使用它:
TypedAggregation<CustomClass> aggregation = newAggregation(CustomClass.class,
new CustomProjectAggregationOperation(operation)
);
AggregationResults<CustomClass> result = mongoTemplate.aggregate(aggregation, CustomClass.class); 发布于 2017-12-24 21:38:20
我添加了同样的问题,并在谷歌上搜索,这是我找到的第一个结果,所以我想为未来的读者补充说,这个功能现在通过ConditionalOperators.Cond类从1.10版本的RC1开始可用。
您可以阅读JavaDoc here。
https://stackoverflow.com/questions/29186185
复制相似问题