MongoDB 入门教程实战学习笔记-21-mongo cursor 游标

小编 2026-07-02 阅读:467 评论:0
Cursor db.collection.find() 方法返回游标。 若要访问文档, 您需要迭代游标。但 是, 在 mongo shell 中, 如果返回的光标未分配给使用 var 关键字的...

Cursor

db.collection.find() 方法返回游标。

若要访问文档, 您需要迭代游标。但

是, 在 mongo shell 中, 如果返回的光标未分配给使用 var 关键字的变量, 则光标将自动迭代 20次, 以打印结果中的前20个文档。

下面的示例介绍手动迭代游标以访问文档或使用迭代器索引的方法。

手动迭代光标

在 mongo shell 中, 当您使用 var 关键字将从 find() 方法返回的游标分配给变量时, 游标不会自动迭代。

您可以调用 shell 中的游标变量, 最多循环访问 20次 并打印匹配的文档, 如下例所示:

  • 获取
var myCursor = db.inventory.find( { status: \"A\" });
  • 打印
myCursor

或者使用 hasNext() + next() 的方式输出

  • 打印
while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}
;
  • 使用 printjson()
while (myCursor.hasNext()) {
   printjson(myCursor.next());
}
;
  • forEach 方式
myCursor.forEach(printjson);

指定下标

在 mongo shell 中, 您可以使用 toAarray() 方法迭代游标并返回数组中的文档, 如下所示

var myCursor = db.inventory.find( { status: \"A\" });
var documentArray = myCursor.toArray();
var myDocument = documentArray[3];

toArray() 方法将光标返回的所有文档加载到 ram 中;方法耗尽光标。

此外, 某些驱动程序通过使用游标上的索引 (即游标[索引]) 提供对文档的访问。

这是首先调用 toArray() 方法, 然后在生成的数组上使用索引的快捷方式。

其他方式

var myDocument = myCursor[1];
myCursor.toArray() [1];

Cursor 属性

非活动游标的闭合

默认情况下, 服务器将在10分钟不活动后自动关闭光标, 或者如果客户端已耗尽光标。

若要重写 mongo shell 中的此行为, 可以使用 cursors.noCursorTimeout() 方法:

var myCursor = db.users.find().noCursorTimeout();

设置 “节点光标超时” 选项后, 必须使用 cur点. close () 手动关闭光标, 或者用尽光标的结果。

有关设置 “节点超时” 选项的信息, 请参阅drivers程序文档。

光标隔离

当游标返回文档时, 其他操作可能会与查询交错。

对于 mmapv1 存储引擎, 对文档的中间写入操作可能会导致游标在文档发生更改时多次返回文档。

若要处理这种情况, 请参阅光标快照上的信息。

光标批次

mongodb 服务器批量返回查询结果。批处理中的数据量不会超过 bson 文档的最大大小。

若要覆盖批处理的默认大小, 请参阅 batchSize() 和 limit()。

版本3.4 中的新功能: 类型 find()、aggregate()、listIndexes 和 listCollections的操作每批最多返回16兆字节。

batchSize() 可以强制执行较小的限制, 但不能强制执行较大的限制。

默认情况下, find()、aggregate() 操作的初始批处理大小为101个文档。

针对生成的游标发出的后续 getmore 操作没有默认批处理大小, 因此它们仅受到16兆字节消息大小的限制。

对于包含不带索引的排序操作的查询, 服务器必须加载内存中的所有文档才能执行排序, 然后才能返回任何结果。

当您遍历游标并到达返回的批处理的末尾时, 如果有更多的结果, cursor.next() 将执行 getmore 操作来检索下一个批处理。

要在迭代游标时查看批处理中保留的文档数, 可以使用 objsLeftInBatch() 方法, 如下面的示例所示:

var myCursor = db.inventory.find();

var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null;

myCursor.objsLeftInBatch();

光标信息

方法返回包含指标字段的文档。指标字段包含一个度量值. 光标字段, 其中包含以下信息:

  • 自上次服务器重新启动以来超时游标数

  • DBQuery.Option.noTimeout 设置选项以防止在一段时间不活动后超时的打开游标数

  • “固定” 打开的游标数

  • 打开游标的总数

请考虑下面的示例, 该示例调用 db.serverStatus() 方法, 并从结果中访问指标字段, 然后从指标字段访问游标字段:

命令

db.serverStatus().metrics.cursor
  • 结果
{
	\"timedOut\" : NumberLong(0),
	\"open\" : {
		\"noTimeout\" : NumberLong(0),
		\"pinned\" : NumberLong(0),
		\"total\" : NumberLong(0)
	}
}

参考资料

Iterate a Cursor in the mongo Shell

目录

MongoDB 入门教程实战学习笔记-00-目录

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表