首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring-MongoDb聚合框架中使用$cond操作

如何在Spring-MongoDb聚合框架中使用$cond操作
EN

Stack Overflow用户
提问于 2015-03-22 02:08:30
回答 2查看 7.5K关注 0票数 10

我有一个聚合管道,其中包含如下项目:

代码语言:javascript
复制
$project: {
  start: {
    $cond: {
      if: {
        $eq: ["$start", "EARLY"]
      },
      then: "$deltastart.start",
      else: "$deltastart.end"
    }
  },...
},...

它在mongo shell中工作得很好。如何使用Spring-Mongodb中的聚合框架来表达这一点?我见过ProjectionOperationBuilder、ExpressionProjectionOperationBuilder类型,但没有举例说明如何使用它们……有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-03-22 02:38:35

如果使用当前通过$project管道支持运算符的Spring Data发行版,则可以将其转换为(未测试):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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实现,该聚合管道与您拥有的聚合管道相同:

代码语言:javascript
复制
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中使用它:

代码语言:javascript
复制
TypedAggregation<CustomClass> aggregation = newAggregation(CustomClass.class,
    new CustomProjectAggregationOperation(operation)
);
AggregationResults<CustomClass> result = mongoTemplate.aggregate(aggregation, CustomClass.class); 
票数 10
EN

Stack Overflow用户

发布于 2017-12-24 21:38:20

我添加了同样的问题,并在谷歌上搜索,这是我找到的第一个结果,所以我想为未来的读者补充说,这个功能现在通过ConditionalOperators.Cond类从1.10版本的RC1开始可用。

您可以阅读JavaDoc here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29186185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档