承接国内外服务器租用托管、定制开发、网站代运营、网站seo优化托管接单、网站代更新,新老站点皆可!!咨询QQ:3787320601

MongoDB 游标详解及实例代码

管理员 2023-07-12 08:42:05 互联网圈 8 ℃ 0 评论 10508字 收藏

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 游标详解及实例代码

https://www.wanzijz.com/view/63527.html

X

截屏,微信识别二维码

微信号:weimawl

(点击微信号复制,添加好友)

打开微信