游标相当于C语言的指针,可以定位到某条记录,在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()访问数据库时会根据缺省游标设定将结果读取到本地
关于mongodb 游标的介绍就到这,上述示例有一定的借鉴价值,需要的朋友可以参考,希望大家阅读完这篇文章之后大有收获,想要了解更多mongodb 游标内容,大家可以继续关注其他文章。