解决runCommand只查询到101条数据

news2025/1/23 11:21:00

最近在开发中使用runCommand查询数据时,发现每次返回的数据量都是101条,而我需要查询的是全部的数据,带着问题,扒了一下runCommand数据查询操作的官方文档,得到了问题的答案。

准备运行环境

MongoClient

这里我是用的Mongo驱动是3.4.3版本的(目前项目中使用的是这个驱动);

ServerAddress serverAddress = new ServerAddress("127.0.0.1", 27017);
MongoClientOptions mongoClientOptions = MongoClientOptions.builder().build();
MongoCredential mongoCredential = MongoCredential.createCredential("username", "db", "password".toCharArray());

MongoClient mongoClient = new MongoClient(Collections.singletonList(serverAddress),
        Collections.singletonList(mongoCredential), mongoClientOptions);

代码中使用mongodb地址、库、用户名、密码等信息创建了MongoClient对象

初始化数据

MongoClient对象创建完成后,我们使用单元测试向MongoDB库的test集合中批量插入1024条数据

@Test
public void testInsert() {
    MongoDatabase database = mongoClient.getDatabase("db");

    BasicDBObject basicDBObject = new BasicDBObject();
    basicDBObject.put("insert", "test");

    BasicDBList dbList = new BasicDBList();
    for(int i = 1; i <= 1024; i ++) {
        BasicDBObject document = new BasicDBObject();
        document.put("_id", i);
        document.put("name", "name_" + i);
        dbList.add(document);
    }

    basicDBObject.put("documents", dbList);
    database.runCommand(basicDBObject);
}

问题复现

编写了一个与线上查询逻辑一致的单元测试用例进行问题复现

@Test
public void testFindWithQuestion() {
    MongoDatabase database = mongoClient.getDatabase("db");

    BasicDBObject basicDBObject = new BasicDBObject();
    basicDBObject.put("find", "test");
    BasicDBObject projection = new BasicDBObject();
    projection.put("_id", 1);
    basicDBObject.put("projection", projection);
    Document document = database.runCommand(basicDBObject);

    double ok = document.getDouble("ok");
    if(1 == ok) {
        Document cursor = document.get("cursor", Document.class);
        if(cursor.containsKey("firstBatch")) {
            List<Document> documentList = cursor.get("firstBatch", List.class);
            System.out.println(documentList);
            System.out.println(documentList.size());
        }
    }
}

单元测试执行完之后打印了一下数据条数,结果真的是101条,与线上问题一致:

解决问题

问题来源

带着问题去MongoDB官方文档中查询find操作命令相关的文档:

find — MongoDB Manual

在文档中查找到了batchSize参数,是这样描述的:

此参数用于指定firstBatch中返回的文档数量,默认是101;

看到这里终于明白为什么查询时返回的文档数量是101了,那么接下来的问题就是如何查询到全部的文档。

解决办法

带着问题,继续看文档,最终看到了Output返回参数的介绍。

返回的字段中包含了cursor字段,cursor字段中包含了游标编号和fisrtBatch文档;文档中强调了可以使用getMore命令查询剩余的文档。

getMore文档地址getMore — MongoDB Manual

getMore命令可以和返回游标的命令结合使用,可用于查询find命令或者aggregate命令的游标指向文档的后续批次文档。到这里基本上是找到了如何解决问题的答案。

代码实现

@Test
public void testFind() {
    MongoDatabase database = mongoClient.getDatabase("db");

    BasicDBObject basicDBObject = new BasicDBObject();
    basicDBObject.put("find", "test");
    BasicDBObject projection = new BasicDBObject();
    projection.put("_id", 1);
    basicDBObject.put("projection", projection);
    boolean hasNext = true;
    do {
        Document document = database.runCommand(basicDBObject);
        MongoDocumentList mongoDocumentList = resolveDocument(document);
        System.out.println(mongoDocumentList.documentList);
        System.out.println(mongoDocumentList.documentList.size());
        hasNext = mongoDocumentList.hasNext();
        if(hasNext) {
            basicDBObject = new BasicDBObject();
            basicDBObject.put("getMore", mongoDocumentList.cursor);
            basicDBObject.put("collection", "test");
        }
    } while (hasNext);
}

private MongoDocumentList resolveDocument(Document document) {
    double ok = document.getDouble("ok");
    if(1 == ok) {
        Document cursor = document.get("cursor", Document.class);
        List<Document> documentList = null;
        if(cursor.containsKey("firstBatch")) {
            documentList = cursor.get("firstBatch", List.class);
        } else if (cursor.containsKey("nextBatch")) {
            documentList = cursor.get("nextBatch", List.class);
        }

        return new MongoDocumentList(cursor.getLong("id"), documentList);
    }
    return null;
}

@AllArgsConstructor
private static class MongoDocumentList {
    private Long cursor;
    private List<Document> documentList;

    public boolean hasNext() {
        return 0 != cursor;
    }
}

代码中定义了MongoDocumentList实体,用于封装每次查询的结果,代码中判断查询是否结束是根据getMore命令返回的数据中的cursor编号是否为0进行判断的。

执行单元测试的结果如下:

查询的总数据量刚好是1024条

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+springboot多角色登录

①前端编写 将Homeview修改为manager Manager&#xff1a; <template><div><el-container><!-- 侧边栏 --><el-aside :width"asideWidth" style"min-height: 100vh; background-color: #001529"><div style"h…

什么是拨号VPS(Virtual Private Server)

拨号VPS&#xff08;Virtual Private Server&#xff09;是指通过拨号方式连接到互联网的虚拟专用服务器。它使用调制解调器&#xff08;称为拨号调制解调器&#xff09;来连接到互联网&#xff0c;通常是通过标准电话线或数字电话线接入&#xff0c;而不是传统的互联网连接方式…

14届蓝桥杯省赛 C/C++ B组 T4 飞机降落 (DFS)

记录此题提醒自己&#xff0c;此类时间轴问题可以通过DFS解决 DFS不是能解决所有题吗 对于此题&#xff0c;我们将降落的飞机的个数和时间轴作为DFS的形参&#xff0c;这样可以节省手动回溯的过程。 并且在DFS的过程中我们要加入一些贪心策略&#xff0c;否则直接爆搜有可能搜…

最优算法100例之38-构建乘积数组

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不…

医疗器械FDA | 常见的网络安全材料发补问题都有哪些?

FDA网络安全资料发补咨询点此​​获取https://work.weixin.qq.com/ca/cawcde5ee29d239046 ————————--- 01 安全文档编写问题 FDA网络安全文档编写格式、内容、可读性等未满足官方要求&#xff0c;则将可能被要求发补整改编写后的文档。 02 安全管理问题 a. 网络安…

最优算法100例之31-正则表达式匹配

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而…

python爬虫学习第十六天--------URLError和HTTPError、cookie登录、Handler处理器

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

vivado中移位寄存器的优化(二)

移位寄存器优化用于改善移位寄存器单元&#xff08;SRLs&#xff09;与其他逻辑单元之间的负裕量路径的时序。如果存在对移位寄存器单元&#xff08;SRL16E或SRLC32E&#xff09;的时序违规&#xff0c;优化会从SRL寄存器链的开始或结束位置提取一个寄存器&#xff0c;并将其放…

centos安装使用elasticsearch

1.首先可以在 Elasticsearch 官网 Download Elasticsearch | Elastic 下载安装包 2. 在指定的位置(我的是/opt/zhong/)解压安装包 tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz 3.启动es-这种方式启动会将日志全部打印在当前页面&#xff0c;一旦使用 ctrlc退出就会导…

java web day28

多表查询 内连接 写法 外链接 子查询 标量子查询 列子查询 行子查询 表子查询

小程序实现订阅功能和测试发送订阅信息

现在一次性订阅是只能用户点一次才能发送一次&#xff0c;而针对长期模板只有规定的几种类目政务、民生、交通等等的才可以&#xff0c;所以说感觉这功能其实已经不是很适合使用了&#xff0c;只适合一些特别的场景才可以使用。 地址&#xff1a;https://developers.weixin.qq…

软件设计师26--关系代数

软件设计师26--关系代数 考点1&#xff1a;关系模式相关概念例题&#xff1a; 考点1&#xff1a;关系模式相关概念 并∪&#xff1a;结果是两张表所有记录的合并&#xff0c;相同记录只显示一次。 交∩&#xff1a;结果是两张表中相同的记录。 差-&#xff1a;S1-S2&#xff0…

Linux 下安装 openjdk 17【详细步骤】

👉 目标 了解为什么不选择 oracle jdk17,而是选择 openjdk17linux 下安装 openjdk17 详细步骤为什么不选择 oracle jdk17? 官网:Java Downloads | Oracle 中国 官网描述:JDK 17 binaries are free to use in production and free to redistribute, at no cost, under t…

Goingpub国自然基金-免费查询

可进行年份、学部、项目类别等检索&#xff0c;支持生成主题词汇总分析报告。 最最最关键&#xff0c;免费&#xff0c;只需要你注册登录一下&#xff0c;防止被爬虫侵扰。 界面简单&#xff0c;实用&#xff0c;支持模糊搜索&#xff0c;包含最新2023年数据&#xff0c;共56…

蚁群优化算法(Ant Colony Optimization Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法引言 蚁群算法&#xff0c;是一种模拟蚂蚁觅食行为的优化算法。想象一下&#xff0c;当你在野餐时&#xff0c;不小心洒了一些糖在地上。一…

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家&#xff0c;对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件&#xff0c;旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://…

React18从入门到实战

文章目录 一、React环境的搭建二、项目文件的介绍&#xff08;1&#xff09;package.json&#xff0c;他是项目存放依赖包的地方&#xff0c;里面包括了一些项目核心包及下载的其他插件包&#xff08;2&#xff09;src文件夹是项目源码目录&#xff0c;平时开发页面就在其中&am…

如何成为一名优秀的工程师下

身为工程师&#xff0c;理所当然要重视实践&#xff0c;自然科学不管发展到何时都离不开实验。 电子学本身就是 为了指导工程实践。所以不要谈空洞的理论。现在很多毕业生都面临这样的问题&#xff0c;总是谈一些空洞的理论&#xff0c;甚至错误的但还不以为然的理论。实践可以…

【软考】23种设计模式详解,记忆方式,并举例说明

23种设计模式详解&#xff0c;举例说明 一、创建型模式1.1、抽象工厂模式&#xff08;Abstract Factory&#xff09;1.1.1、简介1.1.2、意图与应用场景1.1.3、结构1.1.4、优缺点1.1.4、示例代码&#xff08;简化版&#xff09; 1.2、建造者模式&#xff08;Builder&#xff09;…

MySQL主从的介绍与应用

mysql主从 文章目录 mysql主从1. 主从简介1.1 主从作用1.2 主从形式 2. 主从复制原理3. 主从复制配置3.1 mysql安装&#xff08;两台主机安装一致&#xff0c;下面只演示一台主机操作&#xff09;3.2 mysql主从配置3.2.1 确保从数据库与主数据库里的数据一样3.2.2 在主数据库里…