MongoDB 游标详解及实例代码
发布时间 - 2026-01-11 00:49:13 点击率:次MongoDB 游标详解

MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档。因此在mongoDB中游标也有定义,声明, 打开,读取,关闭这么个过程。客户端通过游标,能够实现对最终结果进行有效的控制,诸如限制结果数量,跳过部分结果或根据任意键按任意顺序的组合对结果进行各种排序等。下文是针对MongoDB游标的具体介绍。
一、mongoDB游标介绍
db.collection.find()方法返回一个游标,对于文档的访问,我们需要进行游标迭代
mongoDB的游标与关系型数据库SQL中的游标类似,可以通过对游标进行(如限制查询结果数,跳过的结果数等)设置来控制查询结果
游标会消耗内存和相关系统资源,游标使用完后应尽快释放资源
在mongo shell中,如果返回的游标结果集未指定给某个var定义的变量,则,游标自动迭代20次,即输出前20个文档,超出20的情形则需要输入it来翻页
本文内容描述手动方式来实现游标迭代来访问文档或者是用索引迭代
声明游标
var cursor = db.collectioName.find(query,projection);
打开游标
Cursor.hasNext() 判断游标是否已经取到尽头
读取数据
Cursor.Next() 取出游标的下一个文档
关闭游标
cursor.close() 此步骤可省略,通常为自动关闭,也可以显示关闭
用while循环来遍历游标示例
var mycursor = db.bar.find({_id:{$lte:5}})
while(mycursor.hasNext()) {
printjson(mycursor.next());
}
游标生命周期
a、游标完成匹配结果的迭代后,它会清除自身;
b、客户端的游标已经不在作用域内,驱动程序回向服务器发送一条特别的消息,让其销毁;
c、缺省情况下,游标在十分钟内没有使用,游标自动关闭或者客户端已经迭代完整个游标;
d、可以通过cursor.noCursorTimeout()来定义游标超时时间
如:var myCursor = db.users.find().noCursorTimeout()
e、对于自定义超时时长的游标可以使用cursor.close() 来关闭游标
如:db.collection.find(<query>).close()
二、当前环境及数据准备
repSetTest:PRIMARY> db.version()
3.0.12
//创建包含29个文档的集合user
repSetTest:PRIMARY> for (var i=1;i<30;i++){
... db.user.insert({"id":i,"ename":"usr"+i});
... }
WriteResult({ "nInserted" : 1 })
repSetTest:PRIMARY> db.user.count()
29
//查询集合user上所有文档
repSetTest:PRIMARY> db.user.find()
{ "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" }
{ "_id" : ObjectId("5804d07fd974b32430ea9749"), "id" : 2, "ename" : "usr2" }
.............................
{ "_id" : ObjectId("5804d07fd974b32430ea975b"), "id" : 20, "ename" : "usr20" }
Type "it" for more //上面的结果只输出了20行,这个提示表明查看更多应输入it
repSetTest:PRIMARY> it
{ "_id" : ObjectId("5804d07fd974b32430ea975c"), "id" : 21, "ename" : "usr21" }
..............
{ "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" }
二、使用print输出游标结果集
repSetTest:PRIMARY> var myCursor = db.user.find()
while (myCursor.hasNext()) {
print(tojson(myCursor.next()))
}
{ "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" }
..........
{
"_id" : ObjectId("5804d07fd974b32430ea9751"),
"id" : 10,
"ename" : "usr10"
}
................
{
"_id" : ObjectId("5804d07fd974b32430ea9764"),
"id" : 29,
"ename" : "usr29"
}
//上述查询中通过var myCursor进行变量的定义,相当于SQL中的declare cursor cur_name is select ..
//变量 myCursor定义仅仅是定义,并不会访问数据库,而是在myCursor.hasNext()真正访问数据库
//myCursor.next()则是输出下一条记录,hasNext()访问数据库时会根据缺省游标设定将结果读取到本地
三、使用printjsont输出游标结果集
repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}})
while (myCursor.hasNext()) {
printjson(myCursor.next());}
{
"_id" : ObjectId("5804d07fd974b32430ea975c"),
"id" : 21,
"ename" : "usr21"
}
.......
{
"_id" : ObjectId("5804d07fd974b32430ea9764"),
"id" : 29,
"ename" : "usr29"
}
四、使用 forEach()进行迭代
repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}})
repSetTest:PRIMARY> myCursor.forEach(printjson);
{
"_id" : ObjectId("5804d07fd974b32430ea975c"),
"id" : 21,
"ename" : "usr21"
}
................
{
"_id" : ObjectId("5804d07fd974b32430ea9764"),
"id" : 29,
"ename" : "usr29"
}
五、基于数组索引迭代
可以使用toArray()将游标迭代文档返回到一个数组,然后通过数组下标方式进行访问。
该方法将所有由游标返回的文档装载进内存。
//如下示例,将游标返回的内容传递到数组,然后使用 printjson (documentArray[3])输出其中的元素
repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}})
repSetTest:PRIMARY> var documentArray = myCursor.toArray();
repSetTest:PRIMARY> printjson (documentArray[3])
{
"_id" : ObjectId("580d775edeb57e4d05eec0f2"),
"id" : 24, //Author : Leshami
"ename" : "usr24" //Blog : http://blog.csdn.net/leshami
}
//也可以将数组元素输出到某个变量,然后在用printjson(myDocument)输出这个变量,如下
repSetTest:PRIMARY> var myDocument = documentArray[3];
repSetTest:PRIMARY> printjson(myDocument)
{
"_id" : ObjectId("580d775edeb57e4d05eec0f2"),
"id" : 24,
"ename" : "usr24"
}
六、调整游标迭代次数
//设置迭代显示的次数,如下设置为5
repSetTest:PRIMARY> DBQuery.shellBatchSize = 5
5
repSetTest:PRIMARY> db.user.find()
{ "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" }
{ "_id" : ObjectId("5804d07fd974b32430ea9749"), "id" : 2, "ename" : "usr2" }
{ "_id" : ObjectId("5804d07fd974b32430ea974a"), "id" : 3, "ename" : "usr3" }
{ "_id" : ObjectId("5804d07fd974b32430ea974b"), "id" : 4, "ename" : "usr4" }
{ "_id" : ObjectId("5804d07fd974b32430ea974c"), "id" : 5, "ename" : "usr5" }
Type "it" for more //从上面的查询结果可知,当输出5个文档就提示需要输入it来查看更多
repSetTest:PRIMARY> it
{ "_id" : ObjectId("5804d07fd974b32430ea974d"), "id" : 6, "ename" : "usr6" }
{ "_id" : ObjectId("5804d07fd974b32430ea974e"), "id" : 7, "ename" : "usr7" }
{ "_id" : ObjectId("5804d07fd974b32430ea974f"), "id" : 8, "ename" : "usr8" }
{ "_id" : ObjectId("5804d07fd974b32430ea9750"), "id" : 9, "ename" : "usr9" }
{ "_id" : ObjectId("5804d07fd974b32430ea9751"), "id" : 10, "ename" : "usr10" }
Type "it" for more
七、查看游标度量信息
可以通过db.serverStatus()查看游标状态相关的信息,这些信息通常包括
从服务器上次启动之后游标超时的数量
自定义游标超时的数量
游标打开后已经pinned的数量
打开游标的总数目
//如下查询本机游标的信息
repSetTest:PRIMARY> db.serverStatus().metrics.cursor
{
"timedOut" : NumberLong(2),
"open" : {
"noTimeout" : NumberLong(0),
"pinned" : NumberLong(0),
"total" : NumberLong(2)
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# MongoDB
# 游标
# 游标详解
# 游标实例
# PHP MongoDB GridFS 存储文件的方法详解
# PHP操作MongoDB GridFS 存储文件的详解
# MongoDB游标超时问题的4种解决方法
# MongoDB中游标的深入学习
# mongodb数据库游标的使用浅析
# MongoDB通过查询与游标彻底玩转分布式文件存储
# 迭代
# 文档
# 可以通过
# 查询结果
# 则是
# 客户端
# 自定义
# 可以使用
# 查看更多
# 跳过
# 自动关闭
# 是在
# 也有
# 遍历
# 希望能
# 或者是
# 仅仅是
# 大同小异
# 谢谢大家
# 本机
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
奇安信“盘古石”团队突破 iOS 26.1 提权
如何确认建站备案号应放置的具体位置?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
JavaScript如何实现继承_有哪些常用方法
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
lovemo网页版地址 lovemo官网手机登录
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
高性价比服务器租赁——企业级配置与24小时运维服务
如何在阿里云香港服务器快速搭建网站?
如何快速查询网站的真实建站时间?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
如何快速建站并高效导出源代码?
深圳网站制作的公司有哪些,dido官方网站?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
企业网站制作这些问题要关注
如何在IIS中新建站点并配置端口与IP地址?
微信小程序 require机制详解及实例代码
深圳网站制作培训,深圳哪些招聘网站比较好?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
使用spring连接及操作mongodb3.0实例
使用Dockerfile构建java web环境
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
EditPlus中的正则表达式实战(6)
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何在IIS中新建站点并解决端口绑定冲突?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel如何实现用户密码重置功能?(完整流程代码)
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
C++用Dijkstra(迪杰斯特拉)算法求最短路径

