MongoRepository、原生、聚合的使用场景

在MongoDB中,MongoRepository、原生查询(Native Query)、聚合框架(Aggregation Framework)是三种不同的查询和数据处理方式,它们适用于不同的场景和需求。

  1. MongoRepository:
    • 场景: 当你的查询需求简单,可以通过方法名命名规则进行快速的CRUD操作时,使用MongoRepository是一个不错的选择。
    • 优点: 简单易用,无需编写原生的查询语句;Spring Data MongoDB 提供的MongoRepository接口已经实现了很多常见的查询方法。
    • 缺点: 适用于基本的CRUD操作和一些简单查询,但对于复杂的聚合和定制查询,可能不够灵活。
public interface UserRepository extends MongoRepository<User, String> {
    List<User> findByFirstName(String firstName);
    List<User> findByLastName(String lastName);
}


List<Thing> things = thingRepository.findByDeletedAtIsNull();


//复杂查询也是支持的,之前写了巨长的多条件查询也是可以一句代替的
//根据thingId,查询最新的一条数据

public interface ThingDataRepository extends MongoRepository<ThingData, String> {
    ThingData findFirstByThingIdOrderByTimestampDesc(String thingId);
}


//如果查询条件更多更复杂多样,则只能使用聚合查询方法,更高效

2024.1.29加更:

 Thing findByThirdPlatformConfigThirdDeviceIdAndDeletedAtIsNull(String thirdDeviceId);

//这样看起来太长,可以通过注解合理的简化成下面的格式

@Query("{'thirdPlatformConfig.thirdDeviceId': ?0, 'deletedAt': null}")
    Thing findByThirdDeviceId(String thirdDeviceId);

原生查询(Native Query):

  • 场景: 当需要执行一些特定的、复杂的 MongoDB 查询语句时,使用原生查询可以提供更大的灵活性。
  • 优点: 可以直接使用 MongoDB 的查询语法,适用于一些高级查询和特殊需求。
  • 缺点: 需要手动编写 MongoDB 查询语句,可能不够易读和易维护。

原生:

            Query query = new Query();
            query.addCriteria(Criteria.where("deletedAt").is(null));
            List<Thing> things = mongoTemplate.find(query, Thing.class);


聚合框架(Aggregation Framework):
  • 场景: 当需要进行复杂的数据处理和分析,或者需要对多个文档进行聚合操作时,使用聚合框架是一个强大的选择。
  • 优点: 能够处理复杂的数据聚合操作,支持多个阶段的数据处理流程,提供更高级的数据分析能力。
  • 缺点: 编写聚合管道可能较为繁琐,对于简单查询而言可能过于复杂。
Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(Criteria.where("age").gte(25)),
    Aggregation.group("city").count().as("userCount"),
    Aggregation.sort(Sort.Direction.DESC, "userCount")
);

AggregationResults<CityStats> results = mongoTemplate.aggregate(aggregation, "user", CityStats.class);
List<CityStats> cityStatsList = results.getMappedResults();

//---------------案例--------------------/


  // 创建一个空的关键字条件
        Criteria keywordCriteria = new Criteria();

        for (ThingModelDTO.PropertyDTO propSpecDTO : propertiesSpec) {
            String propIdentifier = propSpecDTO.getIdentifier();
            // 第一步:构建基本查询条件,根据thingId和属性标识符查询
            Criteria baseCriteria = Criteria.where("thingId").is(thingId)
                    .and("property.identifier").is(propIdentifier);

            Aggregation aggregation = Aggregation.newAggregation(
                    Aggregation.match(baseCriteria),
                    // 如果有关键字,再执行模糊匹配
                    Aggregation.match(keywordCriteria),
                    Aggregation.sort(Sort.by(Sort.Order.desc("property.timestamp"))),
                    Aggregation.group("property.identifier")
                            .first("property.identifier").as("identifier")
                            .first("property.value").as("value")
                            .first("property.timestamp").as("timestamp")
            );

            try {
                AggregationResults<ThingData.PropertyData> aggregationResults = mongoTemplate.aggregate(
                        aggregation, "thingData", ThingData.PropertyData.class);
                List<ThingData.PropertyData> matchingData = aggregationResults.getMappedResults();
  • 使用MongoRepository进行简单的CRUD操作和基本查询。
  • 使用原生查询处理一些特殊需求,无法通过MongoRepository提供的方法满足的情况。
  • 使用聚合框架处理复杂的数据聚合和分析任务。

综合考虑业务需求和查询复杂度,可以根据具体场景选择合适的查询方式,甚至在一个应用中同时使用多种方式。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原生在以下几个应用场景中发挥重要的作用: 1. 大规模互联网应用:云原生技术可以提高应用程序的可靠性、可扩展性、可维护性和安全性,使得大规模互联网应用能够更好地应对高并发和大流量的挑战。通过容器化、微服务和DevOps等现代化技术,云原生可以实现应用程序的快速部署、弹性伸缩和故障恢复等功能,从而提供更好的用户体验和服务质量。\[1\] 2. 容器化的落地实践:云原生的核心技术之一是容器化,通过将应用程序和其依赖的组件打包成容器,可以实现应用程序的跨平台和隔离运行。容器化的落地实践可以提高应用程序的部署效率和资源利用率,同时也方便了应用程序的管理和维护。\[2\] 3. Serverless的落地实践:Serverless是云原生的另一个重要技术,它可以让开发者更专注于业务逻辑的实现,而无需关注底层的基础设施和资源管理。通过将应用程序以函数的形式部署到云平台上,可以实现按需计费、弹性扩展和自动管理等功能。Serverless的落地实践可以提高开发效率和资源利用率,同时也降低了应用程序的运维成本。\[2\] 总之,云原生在不同的应用场景中都能够发挥重要的作用,提升应用程序的性能和可靠性,同时也提高了开发和运维的效率。 #### 引用[.reference_title] - *1* [云原生的应用场景](https://blog.csdn.net/wusefengye/article/details/130369238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习](https://blog.csdn.net/weixin_51484460/article/details/125382778)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值