MongoDb-MongoTemplate 简单使用


使用MongoTemplate 实现简单查询

1. pom依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

2. impl

@Resource
private MongoTemplate mongoTemplate;



AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
//封装查询结果条件
Aggregation reportlist = Aggregation.newAggregation(match(vo),group(vo), sort(vo), skip(vo), limit(vo)).withOptions(aggregationOptions);
//封装查询总条数条件
Aggregation reportCount = Aggregation.newAggregation(match(vo), group(vo), Aggregation.count().as("total")).withOptions(aggregationOptions);
//封装查询汇总条件
Aggregation reportsum = Aggregation.newAggregation(match(vo), groupSum()).withOptions(aggregationOptions);

//获取查询结果
List<ReportData> list =  mongoTemplate.aggregate(reportlist, "集合名", ReportData.class).getMappedResults();
//获取汇总结果
ReportData  rd = mongoTemplate.aggregate(reportsum, "集合名", ReportData.class).getMappedResults().get(0);
//获取总条数
Long   total = ((Integer) mongoTemplate.aggregate(reportCount, "集合名", Map.class).getMappedResults().get(0).get("total")).longValue();



//where条件
private MatchOperation match(ReportRequestVo vo) {
     Criteria c = Criteria.where("date").gte(vo.getDateStart()).lte(vo.getDateEnd());
     List<Criteria> list = new ArrayList<>();
     list.add(Criteria.where("a_id").in(vo.getAIdList()));
   

     if (!CollectionUtils.isEmpty(vo.getDeIdList())) {
         list.add(Criteria.where("ae_id").nin(vo.getDeIdList()));
     }
     if (StringUtils.isNoneBlank(vo.getSn())) {
         list.add(Criteria.where("sn").is(vo.getSn()));
     }
   
     c.andOperator(list.toArray(new Criteria[0]));
     return Aggregation.match(c);
 }

//group分组  然后查询的字段名
private GroupOperation group(ReportRequestVo vo) {
    return Aggregation.group(vo.getGroupByList().toArray(new String[0]))
            .first("date").as("date")
            .first("a_id").as("aId")
          
            .sum("num").as("num")
            ;
}

//排序
private AggregationOperation sort(ReportRequestVo vo) {
	return Aggregation.sort("desc".equals(vo.getSortOrder()) ? Sort.Direction.DESC : Sort.Direction.ASC, vo.getSortBy());
}

//每页条数
private LimitOperation limit(ReportRequestVo vo) {
 	return Aggregation.limit(vo.getLimit());
}

//从第几条开始
private SkipOperation skip(ReportRequestVo vo) {
    return Aggregation.skip((vo.getPage() - 1) * vo.getLimit());
}

3. 排除结果集默认id字段

  • 问题: 由于查询结果集有默认id字段,java类也有id字段,类型不一致导致类转换异常
  • 处理: 在查询时排除默认id字段
// 添加   Aggregation.project().andExclude("_id")
 Aggregation reportlist = Aggregation.newAggregation(match(vo), groupPlace(vo),Aggregation.project().andExclude("_id")).withOptions(reportAggregationOptions);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,如果你使用 Spring Boot Starter Data MongoDB,那么在使用 MongoTemplate 之前,需要配置 MongoTemplate。在 Spring Boot 中,可以通过在配置类上添加注解 `@EnableMongoRepositories` 来启用 MongoDB 集成。 以下是一个简单的配置类示例,它定义了一个名为 mongoTemplateMongoTemplate bean: ``` @Configuration @EnableMongoRepositories(basePackages = "com.example.mongo.repositories") public class MongoConfig extends AbstractMongoClientConfiguration { @Value("${spring.data.mongodb.uri}") private String connectionString; @Value("${spring.data.mongodb.database}") private String dbName; @Override public MongoClient mongoClient() { ConnectionString connString = new ConnectionString(connectionString); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connString) .build(); return MongoClients.create(settings); } @Override protected String getDatabaseName() { return dbName; } @Bean public MongoTemplate mongoTemplate() throws Exception { return new MongoTemplate(mongoClient(), getDatabaseName()); } } ``` 在这个例子中,我们使用 `@EnableMongoRepositories` 注解来启用 MongoDB 集成,并指定了存储库接口的基本包名称。在 `mongoClient()` 方法中,我们创建了一个 MongoDB 客户端并返回它。在 `mongoTemplate()` 方法中,我们创建了一个名为 mongoTemplateMongoTemplate bean。这个 bean 可以直接在你的代码中注入并使用。 注意,这里我们继承了 `AbstractMongoClientConfiguration` 类,这是因为它提供了一些默认的配置,例如自动配置了 MongoClient 和 MongoDatabaseFactory。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值