使用 MongoDB 进行 Spring Boot 数据聚合

Posted

技术标签:

【中文标题】使用 MongoDB 进行 Spring Boot 数据聚合【英文标题】:Spring Boot Data Aggregation with MongoDB 【发布时间】:2017-04-23 13:15:53 【问题描述】:
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.八一!无法确定 IsNewStrategy。

如何保存存储库?

bayiRepository.save(seciliBayi);

【问题讨论】:

【参考方案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;
    


【讨论】:

感谢您的帮助。但我编辑我的帖子。我有一个 MongoDBConfig.java。如何在类中添加 mongotemplate? 添加了我的配置类。您可以在此参考 mongoTemplate。 我有问题。当我更改我的 mongoconfigure 时,我无法保存数据。我添加了我的帖子外观。

以上是关于使用 MongoDB 进行 Spring Boot 数据聚合的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security、Spring Boot 和 MongoDB 进行密码编码和解码

使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序

使用spring boot在mongodb中进行多个搜索查询

在 Docker 上使用 MongoDB 进行 Spring Boot

如何使用 spring security 和 spring boot 对 Google 用户进行身份验证,将 mongoDB 作为存储库?

JUnit 测试 MongoDB Spring Boot