mongoDB7--游标cursor

Posted gaomatlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoDB7--游标cursor相关的知识,希望对你有一定的参考价值。

之前我们学习了“增删改查”四中语法和查询表达式的深入学习,我们已经
掌握了一定的操作mongodb数据的能力,那么接下来我们就要考虑我们的操作
的效率问题了。

(1)游标介绍
如果我们查询的数据量比较大会怎样?

我们首先插入10000条数据,因为mongodb底层是javascript引擎,所以我们
可以使用js的语法来插入数据:

[javascript] view plain copy
 
 技术分享技术分享
  1. for(var i=0;i<10000;i++){  
  2.     db.bar.insert({_id:i+1,title:‘helloWorld‘,content:‘aaa‘+i});  
  3. };  


效果:
技术分享

我们查询一下,确实是插入进去了:
技术分享

事实上在日常的业务中,很少有一次性取10000条数据的,但是有时候
从数据库取出来的数据是跨数据的,比如取第100页的数据。我们查询
的时候不想一次性取出那么多数据,想进行逐条处理,这个时候我们就
需要使用“游标(cursor)”来解决。

什么是“游标”?
通俗的说,游标不是查询结果,而是查询的一个返回资源或者接口,通过
这个接口,可以逐条读取数据。
就类似java中的读取流一样,使用包装类的readLine()方法一行一行去读。
技术分享


(2)游标使用语法
声明游标:
var cursor=db.collectionName.find({filed:value,...});
find的查询结果赋值给了游标cursor变量。

我们获取我们刚刚插入的10000条数据的游标对象(条件是_id<=5),然后分别打
印所有数据的信息:
技术分享
其中next()方法就是取出下一个数据。printjson就是以json格式打印出数据。

同样也可以使用js的while语法来循环打印刚刚的数据:
技术分享

当然也可以使用for循环来打印:
技术分享

还有一个比较常用的方法,叫“forEach”,每一个forEach里面有一个
回调函数,这个函数中的obj对象就是游标指向的数据集的每一个数据。
技术分享

这个方法给了我们很大的自由度,可以在回调函数中做一些我们想做的操作。


(3)游标在数据库的应用
游标在分页时如何使用?
例如查询到10000行,跳过100页,取10行。
一般的,我们假设每页N行,当前是page页,就需要跳过(page-1)*N行,
再取N行。在mysql中,我们可以使用limit offset,N来实现。
在mongodb中,使用skip(),limit()函数来实现。

我们取出我们10000条数据的第9996-10000条的数据,可以使用skip()
函数来实现:
技术分享

可以使用limit限制取出的数据条数,
我们查询第801页,每页10条:
技术分享

同理,也可以在查询的时候使用分页方法:
技术分享

如果我们不想迭代打印,想直接把结果以数组的形式打印出来,
使用游标的toArray()方法:
技术分享

想取出某一个,使用数组的下标即可:
技术分享

这里要提醒大家的是,如果查询少量的数据,可以使用toArray方法,
查询大量的数据不建议使用toArray方法,因为toArray方法会把所有
的行立即以对象的形式组织在内存里,十分耗费内存,可以在取出少

量几行时,使用此功能。

转载请注明出处:http://blog.csdn.net/acmman/article/details/54426116














































































以上是关于mongoDB7--游标cursor的主要内容,如果未能解决你的问题,请参考以下文章

mongodb7数据备份数据恢复

mysql之游标

如何使用Oracle的游标?

Oracle游标使用总结

sql server 中游标详解

ORACLE游标详解