MongoDB 游标详解及实例代码


本文整理自网络,侵删。

 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"
  }

五、基于数组索引迭代

阅读剩余部分

相关阅读 >>

mongodb orm框架的注意事项及简单使用

燕十八mongodb视频资料分享

使用mongodb操作文档

mongodb实现查询、分页和排序操作以及游标的使用

mongodb中对文档的增删查改基本操作方法总结

mongodb 实现远程连接

mongodb运行日志实现自动分割的方法实例

mongodb使用mongoexport和mongoimport命令,批量导出和导入json数据到同一张表的实例

mongodb4.2.5安装方法操作步骤

mongodb远程访问配置步骤详解

更多相关阅读请进入《mongodb》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...