mongoDB批量修改时间类型字段,在原有时间上减少8小时

原因

之前使用Navicat看到时间存在时区问题,所以在后台代码都增加了8小时,但后来使用metabse时发现类似工具都支持修改时区,例如Robo 3T等。所以产生了此需求

步骤

  1. 修改原来的代码,把所有的增加/减少8小时,时区差的相关代码都移除
  2. 重启服务
  3. 重启时使用接口调用修改时间的方法,确保新数据不受影响的同时,老数据全部处理
  4. 关键代码
@Override
    public void init() {
        // 构建聚合查询的结果总数
        Criteria criteria = new Criteria();
        Aggregation countAggregation = newAggregation(
                match(criteria),
                group().count().as("total_count")
        );
        AggregationResults<Document> results = mongoTemplate.aggregate(countAggregation, "flow_tracking", Document.class);
        if (results.getMappedResults().size() <= 0){
            return;
        }
        Integer resultsSize = (Integer) results.getMappedResults().get(0).get("total_count");
 
        /**
         * 如果不存在空的数据,则结束方法
         */
        if (resultsSize > 0) {
            /**
             * 根据结果总数分页处理
             */
            Integer cycleNum = (resultsSize / 10000) + 1;
 
            for (Integer i = 0; i < cycleNum; i++) {
                Integer skipNum = i==0?0:i*10000;
                BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "flow_tracking");
                Aggregation aggregation = newAggregation(
                        match(criteria),
                        project("add_time","start_time","end_time"),
                        skip(skipNum),
                        limit(10000)
                );
                AggregationResults<Document> documents = mongoTemplate.aggregate(aggregation, "flow_tracking", Document.class);
 
 
 
                List<Pair<Query, Update>> updateList = new LinkedList<>();
 
                documents.getMappedResults().forEach(data -> {
                    Query query = new Query(new Criteria("_id").is(data.get("_id")));
                    Update update = new Update();
                    update.set("add_time", new Timestamp(data.getDate("add_time").getTime()).toLocalDateTime().minusHours(8));
                    update.set("start_time", new Timestamp(data.getDate("start_time").getTime()).toLocalDateTime().minusHours(8));
                    update.set("end_time", new Timestamp(data.getDate("end_time").getTime()).toLocalDateTime().minusHours(8));
                    Pair<Query, Update> updatePair = Pair.of(query, update);
                    updateList.add(updatePair);
 
                });
                operations.updateMulti(updateList);
                operations.execute();
            }
        }
    }

后续

查询时使用Robo3T设置时区,Navicat查看是仍会显示比正常时间少8小时

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容