首页 > 解决方案 > MongoDB 游标

问题描述

我只是想验证一些关于游标的东西。请让我知道以下陈述是否正确:

  1. 光标创建在mongoDB database server. 因此,它占用了数据库服务器上的 RAM/内存。
  2. 触发查找查询后,我需要等到扫描完成才能找到查询结果。
  3. 完成整个扫描后,将创建游标,然后我可以遍历结果,而不是over the wire一次获取整个结果集。
  4. 将批量大小设置为 1k 并不意味着,如果我的结果有10k文档,则 find 将在1k找到这些文档后立即返回文档,然后继续查找另一个 1k,依此类推。

总之,如果我将游标的批量大小设置为 1k,并且我知道我的结果集包含 100k 个文档,并且如果find/aggregate查询游标需要 5 秒来进行搜索并从 300k 文档的集合中创建游标,我有等待5 秒钟,直到我可以开始在该光标上使用迭代。

如果在1k/100k总共 5 秒中的 1 秒内搜索到了第一个文档,那么这 1k 将被返回,我无法开始处理它们。在整个结果集准备好之前,我无法开始流式传输结果。

那正确吗?

标签: javascriptnode.jsmongodbmongoosedatabase-cursor

解决方案


光标流

您应该在服务器获得第一批结果后立即获得结果,而不是在获得整个结果集时。如果结果集通过其他方式可用(例如,通过顺序迭代集合),游标的要点是永远不要将结果集实际保存在服务器的内存中。

游标是在 mongoDB 数据库服务器上创建的。因此,它占用了数据库服务器上的 RAM/内存。

是的,有一些与游标相关的资源。

触发查找查询后,我需要等到扫描完成才能找到查询结果。

“扫描”指的是什么?

您需要等待服务器识别出第一批文档的大小。例如,如果您正在执行一个需要对整个集合进行排序的查询,那么在获得第一个文档之前,必须对集合进行完全迭代。如果您正在执行不需要排序的查询,它可能会在服务器访问所有匹配的文档之前返回第一批。

完成整个扫描后,将创建游标,然后我可以遍历结果,而不是一次通过线路获取整个结果集。

在迭代中更正,请参见上文“整个扫描”。

将批量大小设置为 1k 并不意味着,如果我的结果有 10k 个文档,则 find 将在找到这些文档后立即返回 1k 个文档,然后继续查找另一个 1k 等等。

如果可以以这种方式完成查询,则可以。

总之,如果我将游标的批量大小设置为 1k,并且我知道我的结果集有 100k 个文档,并且如果查找/聚合查询游标需要 5 秒来进行搜索并从 300k 文档的集合中创建游标,我必须等待 5 秒才能开始在该光标上使用迭代。

不,除非您的聚合管道在最后阶段执行无索引排序之类的操作。

如果在总共 5 秒中的 1 秒内搜索了前 1k/100k 文档,那么这 1k 将被返回,我无法开始处理它们。

不,如果通过索引扫描或集合扫描可以满足查询并且不需要排序,则这是可能的。


推荐阅读