javascript - MongoDB 游标
问题描述
我只是想验证一些关于游标的东西。请让我知道以下陈述是否正确:
- 光标创建在
mongoDB database server
. 因此,它占用了数据库服务器上的 RAM/内存。 - 触发查找查询后,我需要等到扫描完成才能找到查询结果。
- 完成整个扫描后,将创建游标,然后我可以遍历结果,而不是
over the wire
一次获取整个结果集。 - 将批量大小设置为 1k 并不意味着,如果我的结果有
10k
文档,则 find 将在1k
找到这些文档后立即返回文档,然后继续查找另一个 1k,依此类推。
总之,如果我将游标的批量大小设置为 1k,并且我知道我的结果集包含 100k 个文档,并且如果find/aggregate
查询游标需要 5 秒来进行搜索并从 300k 文档的集合中创建游标,我有等待5 秒钟,直到我可以开始在该光标上使用迭代。
如果在1k/100k
总共 5 秒中的 1 秒内搜索到了第一个文档,那么这 1k 将被返回,我无法开始处理它们。在整个结果集准备好之前,我无法开始流式传输结果。
那正确吗?
解决方案
光标流。
您应该在服务器获得第一批结果后立即获得结果,而不是在获得整个结果集时。如果结果集通过其他方式可用(例如,通过顺序迭代集合),游标的要点是永远不要将结果集实际保存在服务器的内存中。
游标是在 mongoDB 数据库服务器上创建的。因此,它占用了数据库服务器上的 RAM/内存。
是的,有一些与游标相关的资源。
触发查找查询后,我需要等到扫描完成才能找到查询结果。
“扫描”指的是什么?
您需要等待服务器识别出第一批文档的大小。例如,如果您正在执行一个需要对整个集合进行排序的查询,那么在获得第一个文档之前,必须对集合进行完全迭代。如果您正在执行不需要排序的查询,它可能会在服务器访问所有匹配的文档之前返回第一批。
完成整个扫描后,将创建游标,然后我可以遍历结果,而不是一次通过线路获取整个结果集。
在迭代中更正,请参见上文“整个扫描”。
将批量大小设置为 1k 并不意味着,如果我的结果有 10k 个文档,则 find 将在找到这些文档后立即返回 1k 个文档,然后继续查找另一个 1k 等等。
如果可以以这种方式完成查询,则可以。
总之,如果我将游标的批量大小设置为 1k,并且我知道我的结果集有 100k 个文档,并且如果查找/聚合查询游标需要 5 秒来进行搜索并从 300k 文档的集合中创建游标,我必须等待 5 秒才能开始在该光标上使用迭代。
不,除非您的聚合管道在最后阶段执行无索引排序之类的操作。
如果在总共 5 秒中的 1 秒内搜索了前 1k/100k 文档,那么这 1k 将被返回,我无法开始处理它们。
不,如果通过索引扫描或集合扫描可以满足查询并且不需要排序,则这是可能的。
推荐阅读
- java - 2 个外部 Maven 依赖项没有限定类型的 bean
- python - 订阅多个主题 Asyncio_mqtt
- postgresql - PostgreSQL 中从字符串转换为 uuid 的迁移
- javascript - 如果页面关闭不正确或转到 react js 中的另一个组件,如何起草数据?
- sql - 将 SQL/SAS 表行转置为多列
- node.js - 对使用传递空值的节点 js 部署的 ml 模型同时进行多个请求
- loops - 如何在列表中找到与同一列表中先前选择的项目相似的下一个项目?Python
- javascript - “TypeError:无法读取未定义的属性'forEach'”在NodeJS中
- python - TensorFlow 不需要的子图
- android - 错误。LiveLiteralKt 未找到!在事件日志中