详解MongoDB游标的基本操作及应用是怎样
Admin 2022-11-16 群英技术资讯 355 次浏览
MongoDB 游标详解
MongoDB中的游标与关系型数据库中的游标在功能上大同小异。游标相当于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( ).close()
二、当前环境及数据准备
repSetTest:PRIMARY> db.version() 3.0.12 //创建包含29个文档的集合user repSetTest:PRIMARY> for (var i=1;i 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游标的基本操作及应用是怎样”的学习就结束了,希望能够解决大家的疑惑,另外大家动手实践也很重要,对大家加深理解和学习很有帮助。如果想要学习更多的相关知识,欢迎关注群英网络,小编每天都会给大家分享实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
idea配置mongodb的方法:1、安装mongodb插件;2、连接mongodb,首先点击添加链接,然后填写链接的名称,然后是服务的IP地址,然后点击Test Connection,出现弹框则连接成功。
这篇文章给大家介绍一些mongodb基本命令,小编认为是比较实用的,因此分享给大家作参考,有这方面学习需要的朋友可以了解一下,下面就跟随小编来看看吧。
mongodb数据库删除语句是db.dropDatabase(),此语句可以删除当前数据库,所以使用此语句需要先使用use命令切换到指定数据库。
MongoDB 插入文档 本章节中我们将向大家介绍如何将数据插入到 MongoDB 的集合中。 文档的数据结构和 JSON 基本一样。 所有存储在集合中的数据都是 BSON 格式。 BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。 插入文档 MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下: db.COLLECTION_NAME.insert(d..
MongoDB 监控 在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能。这样在大流量得情况下可以很好的应对并保证MongoDB正常运作。 MongoDB中提供了mongostat 和 mongotop 两个命令来监控MongoDB的运行情况。 mongostat 命令 mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的..
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008