全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

五、基于数组索引迭代

    可以使用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通过查询与游标彻底玩转分布式文件存储  # 迭代  # 文档  # 可以通过  # 查询结果  # 则是  # 客户端  # 自定义  # 可以使用  # 查看更多  # 跳过  # 自动关闭  # 是在  # 也有  # 遍历  # 希望能  # 或者是  # 仅仅是  # 大同小异  # 谢谢大家  # 本机 


相关文章: 企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何快速查询域名建站关键信息?  存储型VPS适合搭建中小型网站吗?  ,石家庄四十八中学官网?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  建站主机核心功能解析:服务器选择与网站搭建流程指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站之星Pro快速搭建教程:模板选择与功能配置指南  如何零基础开发自助建站系统?完整教程解析  建站之星好吗?新手能否轻松上手建站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何选择最佳自助建站系统?快速指南解析优劣  建站之星如何取消后台验证码生成?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何配置IIS站点权限与局域网访问?  专业公司网站制作公司,用什么语言做企业网站比较好?  韩国服务器如何优化跨境访问实现高效连接?  如何在Windows环境下新建FTP站点并设置权限?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  建站之星下载版如何获取与安装?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站之星展会模板:智能建站与自助搭建高效解决方案  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  定制建站是什么?如何实现个性化需求?  音乐网站服务器如何优化API响应速度?  建站VPS配置与SEO优化指南:关键词排名提升策略  如何在局域网内绑定自建网站域名?  建站VPS能否同时实现高效与安全翻墙?  建站主机功能解析:服务器选择与快速搭建指南  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Android使用GridView实现日历的简单功能  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  英语简历制作免费网站推荐,如何将简历翻译成英文?  c++ stringstream用法详解_c++字符串与数字转换利器  名字制作网站免费,所有小说网站的名字?  建站之星如何修改网站生成路径?  如何选择网络建站服务器?高效建站必看指南  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站主机选购指南与交易推荐:核心配置解析  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何通过智能用户系统一键生成高效建站方案?  如何设置并定期更换建站之星安全管理员密码?  宁波免费建站如何选择可靠模板与平台? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。