加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

掌握MongoDB游标的使用的方法

发布时间:2024-01-08 18:56:44 所属栏目:系统 来源:DaWei
导读: MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档。因此在mongoDB中游标也有定义,声明, 打开,读取,关闭这么
MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于C语言的指针,可以定位到某条记录,在MongoDB中,则是文档。因此在mongoDB中游标也有定义,声明, 打开,读取,关闭这么个过程。客户端通过游标,能够实现对最终结果进行有效的控制,诸如限制结果数量,跳过部分结果或根据任意键按任意顺序的组合对结果进行各种排序等。

通俗的说,游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口.
客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等!
直接对一个集合调用find()方法时,我们会发现,如果查询结果超过二十条,只会返回二十条的结果,这是因为Mongodb会自动递归find() 返回的游标。

下文是针对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"
 }

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章