当前位置: 首页 > news >正文

Mongo Java Driver使用getCollection做分页查询遇到的一些坑

背景

最近在做Mongo上的表数据的迁移,原本应该是DBA要干的活,但是想着DBA排期比较长,加上我们开发的权限又非常有限,而且数据量又没有多少,就想着自己开发个小小的程序从旧实例上查,写到新实例上去算了。于是就遇到了今天要分享的这个坑。

有问题代码

这个方法目的是查询表的所有数据,但是返回的结果实际会有问题,返回来的并非全量数据。原因是分好页之后,在去查询每页的数据的时候都重新再查询了下集合,然后再取分页数据,这个过程中有其他的线程也去修改这个集合的数据,集合数据变化了就会导致查询到的分页数据不正确。

   /*** 这个方法目的是查询表的所有数据,但是返回的结果实际会有问题,会出现数据不完整* 原因是分好页之后,查询每页的数据的时候都重新查询了集合,这个过程中有其他的线程也去修改这个集合的数据,* 集合数据变化了就会导致查询到的分页数据不正确。* @param dbName* @param tableName* @return*/public List<Document> queryCollections_Error(String dbName, String tableName) {List<Document> result = new ArrayList<>();long count = this.count(dbName, tableName);int pageSize = 1000;for (int idx = 0; idx < count; idx += pageSize) {result.addAll(this.queryCollectionsByPage(dbName, tableName, idx, pageSize));}return result;}

改正后的代码

改正后的代码,是只能保证了在程序开始运行的这一刻mongo表的快照的数据同步到新表是准确的,但是同步程序运行过程中如果表数据发生了变更,这部分数据是没有变更到新实例上面去的,这个大家需要注意。我们的业务是对内的业务,而且数据量不大,因此在同步的时候禁写掉这个服务中断时间可以接受。如果是不可接受服务中断,那么应该要考虑下全量+增量的方案。

    public List<Document> queryCollections(String dbName, String tableName) {List<Document> result = new ArrayList<>();MongoCollection<Document> mongoCollection = this.mongoClient.getDatabase(dbName).getCollection(tableName);long count = mongoCollection.countDocuments();int pageSize = 1000;for (int idx = 0; idx < count; idx += pageSize) {FindIterable<Document> iterable = mongoCollection.find().skip(idx).limit(pageSize);iterable.forEach(new Block<Document>() {@Overridepublic void apply(Document document) {result.add(JSON.parseObject(JSON.toJSONString(document), Document.class));}});}return result;}

完整代码

下载

相关文章:

Mongo Java Driver使用getCollection做分页查询遇到的一些坑

背景 最近在做Mongo上的表数据的迁移&#xff0c;原本应该是DBA要干的活&#xff0c;但是想着DBA排期比较长&#xff0c;加上我们开发的权限又非常有限&#xff0c;而且数据量又没有多少&#xff0c;就想着自己开发个小小的程序从旧实例上查&#xff0c;写到新实例上去算了。于…...

RK3568笔记六十四:SG90驱动测试

若该文为原创文章,转载请注明原文出处。 前面有测试过PWM驱动,现在使用两种方式来产生PWM驱动SG90,实现舵机旋转任意角度 方法一:使用硬件PWM 方法二:使用高精度定时器,GPIO模拟PWM. 一、PWM子系统框架 二、SG90控制方法 舵机的控制需要MCU产生一个周期为20ms的脉冲信号…...

31 基于51单片机的水位监测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;DHT11温湿度检测&#xff0c;水位检测&#xff0c;通过LCD1602显示&#xff0c;超过阈值报警&#xff0c;继电器驱动电机转动。通过矩阵按键切换选择设置各项参数阈值。 …...

Docker 实践与应用举例

一、容器化Web应用&#xff1a; 创建一个Docker容器来运行一个简单的Web应用&#xff0c;例如一个基于Node.js的Express应用。首先&#xff0c;编写Dockerfile来定义容器的构建过程&#xff0c;然后使用Docker命令来构建和运行容器。 使用Docker Compose来定义和管理多个容器组…...

公开数据集网站分享

参考链接&#xff1a;常用的医学组织切片细胞图像数据集_细胞分割数据集-CSDN博客文章浏览阅读1.3w次&#xff0c;点赞32次&#xff0c;收藏133次。乳腺癌细胞图像数据集、血细胞图像数据集、HE染色切片、疟疾细胞图像图像识别、分类、分割_细胞分割数据集https://blog.csdn.ne…...

实验OSPF路由协议(课内实验)

实验1&#xff1a;OSPF路由协议 实验目的及要求&#xff1a; 通过实验&#xff0c;能够理解链路状态型路由协议OSPF协议的工作原理&#xff0c;掌握如何实现单区域 OSPFv2配置指令&#xff0c;能够熟练的应用各种OSPF协议相关的配置指令完善网络设计。掌握验证OSPFv2网络连接…...

GPU Puzzles讲解(一)

GPU-Puzzles项目可以让你学习到GPU编程和cuda核心并行编程的概念&#xff0c;通过一个个小问题让你理解cuda的编程和调用&#xff0c;创建共享显存空间&#xff0c;实现卷积和矩阵乘法等&#xff0c;通过每个小问题之后还会奖励一个狗狗小视频&#x1f601; 下面是项目的仓库&…...

滚雪球学Oracle[1.3讲]:内存与进程架构

全文目录&#xff1a; 前言一、SGA的深度解析1.1 SGA的作用与构成SGA的大小与调整 1.2 数据库缓冲区缓存&#xff08;DB Cache&#xff09;DB Cache的工作原理案例演示&#xff1a;调整DB Cache的大小 1.3 共享池&#xff08;Shared Pool&#xff09;的构成与调优共享池的组成部…...

Nginx的正向与反向代理

一、Nginx简介 1. 什么是Nginx Nginx&#xff08;发音为“engine-x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器。Nginx是由俄罗斯的Igor Sysoev&#xff08;伊戈尔赛索耶夫&#xff09;为解决C10k问题&#xff08;即…...

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备...

基于SpringBoot博物馆游客预约系统【附源码】

基于SpringBoot博物馆游客预约系统 效果如下&#xff1a; 主页面 注册界面 展品信息界面 论坛交流界面 后台登陆界面 后台主界面 参观预约界面 留言板界面 研究背景 随着现代社会的快速发展和人们生活水平的提高&#xff0c;文化生活需求也在日益增加。博物馆作为传承文化、…...

【JVM】内存区域划分,类加载的过程,.class文件的格式

一个java写的程序&#xff0c;跑起来就得到了一个java进程&#xff0c;而java进程&#xff1d;JVM上面运行的字节码指令 JVM是「java虚拟机」&#xff0c;负责解释执行java的指令 【JVM内存区域划分】 1.程序计数器&#xff08;比较小的空间&#xff09; 作用:保存了下一条…...

esp32-camera入门(基于ESP-IDF)

主要参考资料&#xff1a; ESP32-S2 Kaluga camera lcd 示例入门: https://blog.csdn.net/Marchtwentytwo/article/details/121121028 摄像头应用方案常见问题汇总: https://docs.espressif.com/projects/esp-faq/zh_CN/latest/application-solution/camera-application.html …...

react中类式组件与函数式组件的区别

在React中&#xff0c;类式组件&#xff08;Class Components&#xff09;与函数式组件&#xff08;Functional Components&#xff09;是两种不同的组件定义方式&#xff0c;它们各有特点&#xff0c;适用于不同的场景。以下是它们之间的主要区别&#xff1a; 一、定义与语法…...

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…...

【重学 MySQL】五十六、位类型

【重学 MySQL】五十六、位类型 定义赋值与使用注意事项应用场景 在MySQL数据库中&#xff0c;位类型&#xff08;BIT类型&#xff09;是一种用于存储位字段值的数据类型。 定义 BIT(n)表示n个位字段值&#xff0c;其中n是一个范围从1到64的整数。这意味着你可以存储从1位到64…...

Centos7 NTP客户端

目录 1. NTP客户端1.1 安装1.2 启动1.3 同步状态异常1.4 更改/etc/chrony.conf配置文件1.5 同步状态正常 1. NTP客户端 1.1 安装 如果chrony没有安装&#xff0c;可以使用以下命令安装 sudo yum install chrony1.2 启动 启动并设置开机自启 sudo systemctl start chronyd …...

手机号归属地查询-手机号归属地-手机号归属地-运营商归属地查询-手机号码归属地查询手机号归属地-运营商归属地

手机号归属地查询API接口是一种网络服务接口&#xff0c;允许开发者通过编程方式查询手机号码的注册地信息。关于快证签API接口提供的手机号归属地查询服务&#xff0c;以下是一些关键信息&#xff1a; 一、快证签API接口简介 快证签API接口可能是一个提供多种验证和查询服务…...

CoppeliaSim和Matlab建立远程连接教程

CoppeliaSim和Matlab建立远程连接教程 Matlab通过调用CoppeliaSim的远程API和库函数实现远程连接,为实现Matlab和CoppeliaSim的联合仿真做准备。 一、获取并查看版本信息 点击 Help 查看版本信息 使用的CoppeliaSim Edu版本为:4.4.0 位数:64bit 二、拷贝API函数和库文件…...

使用STS以及签名URL临时授权访问OSS资源

本文介绍JAVA如何使用STS以及签名URL临时授权访问OSS资源。 注意事项 由于STS临时账号以及签名URL均需设置有效时长&#xff0c;当您使用STS临时账号生成签名URL执行相关操作&#xff08;例如上传、下载文件&#xff09;时&#xff0c;以最小的有效时长为准。例如您的STS临时账…...

5步搭建Sunshine游戏串流服务器:打造你的私人云游戏平台

5步搭建Sunshine游戏串流服务器&#xff1a;打造你的私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的自托管游戏串流服务器&#xff0c;专…...

82、【Agent】【OpenCode】bash 工具提示词(amend 风险)

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】bash 工…...

2026年网络安全行业发展全景解析(技术从业者必看)_最新网络行业发展锐评

2026年网络安全行业发展全景解析&#xff08;技术从业者必看&#xff09; 摘要&#xff1a;随着数字化转型进入深水区&#xff0c;AI、云原生、物联网等技术的普及&#xff0c;网络安全已从“辅助保障”升级为“核心刚需”。 一、行业发展现状&#xff1a;政策与市场双轮驱动&…...

三步搞定RPG Maker游戏资源解密:零基础完整指南

三步搞定RPG Maker游戏资源解密&#xff1a;零基础完整指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMake…...

使用Taotoken后Nodejs项目的大模型API延迟与用量观测体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后Nodejs项目的大模型API延迟与用量观测体验 1. 项目背景与接入动机 在Node.js项目中集成大模型能力时&#xff0c;开…...

游戏修改入门:用Cheat Engine精确扫描血量,5分钟搞定单机游戏数值修改

游戏修改入门&#xff1a;用Cheat Engine精确扫描血量&#xff0c;5分钟搞定单机游戏数值修改 在单机游戏的世界里&#xff0c;偶尔会遇到难度过高或重复刷怪的疲惫感。你是否想过像开发者一样自由调整游戏参数&#xff1f;Cheat Engine&#xff08;简称CE&#xff09;这款开源…...

Programming Bitcoin最佳实践:10个核心编程技巧助你从零掌握比特币开发 [特殊字符]

Programming Bitcoin最佳实践&#xff1a;10个核心编程技巧助你从零掌握比特币开发 &#x1f680; 【免费下载链接】programmingbitcoin Repository for the book 项目地址: https://gitcode.com/gh_mirrors/pr/programmingbitcoin 想要深入理解比特币技术并掌握区块链编…...

2025最权威的降AI率方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 随着人工智能技术迅猛地发展&#xff0c;它在学术研究领域的应用越发深入&#xff0c;对高等…...

Spring Boot安全脚手架:openclaw-security-starter核心架构与实战指南

1. 项目概述&#xff1a;一个面向开发者的安全脚手架最近在梳理团队内部的安全开发规范时&#xff0c;发现一个普遍痛点&#xff1a;每个新项目启动&#xff0c;安全相关的配置总是东拼西凑&#xff0c;从依赖扫描、密钥管理到API安全策略&#xff0c;都得重新来一遍&#xff0…...

使用Gemini-OpenAI代理实现零成本AI模型迁移与协议转换

1. 项目概述&#xff1a;一个让OpenAI生态无缝接入Gemini的桥梁如果你和我一样&#xff0c;长期在AI应用开发的一线折腾&#xff0c;肯定遇到过这样的场景&#xff1a;手头有一个基于OpenAI API&#xff08;比如ChatGPT的gpt-3.5-turbo或gpt-4&#xff09;构建得相当成熟的应用…...