MongoDB的Spring Boot Data Aggregation

时间:2016-12-08 10:23:26

标签: mongodb spring-boot aggregation-framework

db.yorum.aggregate([
    { $match: { bayiId: "5848631a2aa9191f78ff3847" }},
    { $group: { _id: "$bayiId" ,avg: { $avg: "$yildiz" }}}
])

我如何在Spring Boot中使用?

我需要一个“yildiz”平均值。

my collection

avg_yildiz

MongoDBConfig.java

@Configuration
@ComponentScan(basePackages="com.application.repository")
@EnableMongoRepositories(basePackages = "com.application.repository")
@EnableMongoAuditing(modifyOnCreate=false)
public class MongoDBConfig extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "application";
    }

    @Override
    public Mongo mongo() throws Exception {
        return new MongoClient("localhost", 27017);
    }

    @Bean
    public MongoExceptionTranslator exceptionTranslator() {
        return new MongoExceptionTranslator();
    }

    @Bean
    public LoggingEventListener logginEventListener(){
        return new LoggingEventListener();
    }

}

MongoDB配置类。我如何添加mongoTemplate?

修改

  

java.lang.IllegalArgumentException:不支持的实体   com.application.domain.Bayi!无法确定IsNewStrategy。

我如何保存存储库?

bayiRepository.save(seciliBayi);

1 个答案:

答案 0 :(得分:1)

这是Spring的等价物。请注意,您无法使用Repository类中的方法(如普通查询操作)来实现聚合。

<强>代码: -

import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
public String findAverageForYourm(String bayiId) {

    TypedAggregation<Yorum> aggregation = newAggregation(Yorum.class,
             match(Criteria.where("bayiId").is(bayiId)),
             group("bayiId").avg("yildiz").as("avgVal")
        );


    MongoOperations mongoOperations = getMongoConnection();

    AggregationResults<Yorum> results = mongoOperations.aggregate(aggregation, Yorum.class);

    System.out.println(results.getRawResults().get("result"));

    return results.getRawResults().get("result").toString();

}

MongoTemplate对象: -

如果您有对象,则可以将getMongoConnection()替换为mongoTemplate。这是我的项目特定配置。我刚刚添加了它以便澄清。

@SuppressWarnings("resource")
public MongoOperations getMongoConnection() {

    return (MongoOperations) new AnnotationConfigApplicationContext(SpringMongoConfig.class)
            .getBean("mongoTemplate");
}

简单语法: -

AggregationResults<OutputType> results = mongoTemplate.aggregate(agg, "INPUT_COLLECTION_NAME", OutputType.class);

<强>输出: -

[ { "_id" : "5848631a2aa9191f78ff3847" , "avgVal" : 4.333333333333333}]

配置类: -

@Configuration
@EnableMongoRepositories(basePackageClasses = RepositoryPackage.class)
@ComponentScan(basePackageClasses = RepositoryPackage.class)
public class SpringMongoConfig extends AbstractMongoConfiguration {

    public @Bean MongoDbFactory mongoDbFactory() throws Exception {

        return new SimpleMongoDbFactory(new MongoClient(), "localhost");
    }

    public @Bean MongoTemplate mongoTemplate() throws Exception {

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());

        return mongoTemplate;

    }

    @Override
    protected String getDatabaseName() {
        return "localhost";
    }

    @Override
    public Mongo mongo() throws Exception {
        MongoClient client = new MongoClient("localhost");
        client.setWriteConcern(WriteConcern.SAFE);
        return client;
    }

}