记工作中一次遇到难题时的解决方案(MongoDB使用group以及first查询效率变慢)

记工作中一次遇到难题时的解决方案


问题描述

前几天接到一个需求,提供一个查询多设备最后一次的发送GPS的信息,数据是存在MongoDB里面的,每个月的数据都会新建一个collection来存,所以有时候有些设备在当月没有数据的话,需要去查询前一个月的数据返回,所以这里需要一个递归的算法。我原本以为这是一个蛮简单的需求,直接用MongoDB的聚合管道技术的match以及group函数就能轻松解决,我的想法是:

  1. 首先使用match函数筛选所有需要查询的设备GPS信息
  2. 对查询的数据按照记录时间进行倒序排序
  3. 使用group函数对数据进行设备的分类
  4. MongoDB使用group之后会把$_id设置为group的那个字段,很郁闷(# ̄~ ̄#),我又不能改实体类随便映射到某个字段,所以只能在后面再做一些操作

下面是使用聚合函数的代码。

  private List<GpsMiniFullData> findLastList(List<String> guids, Long time, int count, 
  			final List<GpsMiniFullData> gpsMiniFullDataList) {
   
        if (CollectionUtils.isEmpty(guids) || count == getSearchDepth()) {
   
            return gpsMiniFullDataList;
        }
        //拼装查询条件。
        Criteria criteria = Criteria.where(FieldConstants.GUID).in(guids)
                .and(FieldConstants.GPSTIME).lt(time).andOperator(createValidFilter(true));
        //根据guid分组,按时间倒序排序之后取第一条数据。
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.sort(new Sort(new Sort.Order(Direction.ASC, FieldConstants.GUID), 
                        new Sort.Order(Direction.DESC, FieldConstants.GPSTIME))),
                Aggregation.group(FieldConstants.GUID)
                        .first(FieldConstants.ID).as("id")
						...
                        .first(FieldConstants.LOCATION).as(FieldConstants.LOCATION)
        );
        //请求mongo获取结果
        AggregationResults<DBObject
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值