0
点赞
收藏
分享

微信扫一扫

【MongoDb探究】07-游标操作


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

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

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

for(var i=0;i<10000;i++){
db.bar.insert({_id:i+1,title:'helloWorld',content:'aaa'+i});
};


效果:


【MongoDb探究】07-游标操作_skip



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


【MongoDb探究】07-游标操作_curosr_02



事实上在日常的业务中,很少有一次性取10000条数据的,但是有时候


从数据库取出来的数据是跨数据的,比如取第100页的数据。我们查询


的时候不想一次性取出那么多数据,想进行逐条处理,这个时候我们就


需要使用“游标(cursor)”来解决。



什么是“游标”?


通俗的说,游标不是查询结果,而是查询的一个返回资源或者接口,通过


这个接口,可以逐条读取数据。


就类似java中的读取流一样,使用包装类的readLine()方法一行一行去读。


【MongoDb探究】07-游标操作_forEach_03




(2)游标使用语法


声明游标:


var cursor=db.collectionName.find({filed:value,...});


find的查询结果赋值给了游标cursor变量。



我们获取我们刚刚插入的10000条数据的游标对象(条件是_id<=5),然后分别打


印所有数据的信息:


【MongoDb探究】07-游标操作_skip_04


其中next()方法就是取出下一个数据。printjson就是以json格式打印出数据。



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


【MongoDb探究】07-游标操作_forEach_05



当然也可以使用for循环来打印:


【MongoDb探究】07-游标操作_forEach_06



还有一个比较常用的方法,叫“forEach”,每一个forEach里面有一个


回调函数,这个函数中的obj对象就是游标指向的数据集的每一个数据。


【MongoDb探究】07-游标操作_curosr_07



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




(3)游标在数据库的应用


游标在分页时如何使用?


例如查询到10000行,跳过100页,取10行。


一般的,我们假设每页N行,当前是page页,就需要跳过(page-1)*N行,


再取N行。在Mysql中,我们可以使用limit offset,N来实现。


在mongodb中,使用skip(),limit()函数来实现。



我们取出我们10000条数据的第9996-10000条的数据,可以使用skip()


函数来实现:


【MongoDb探究】07-游标操作_curosr_08



可以使用limit限制取出的数据条数,


我们查询第801页,每页10条:


【MongoDb探究】07-游标操作_limit_09



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


【MongoDb探究】07-游标操作_skip_10



如果我们不想迭代打印,想直接把结果以数组的形式打印出来,


使用游标的toArray()方法:


【MongoDb探究】07-游标操作_forEach_11



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


【MongoDb探究】07-游标操作_mongodb_12



这里要提醒大家的是,如果查询少量的数据,可以使用toArray方法,


查询大量的数据不建议使用toArray方法,因为toArray方法会把所有


的行立即以对象的形式组织在内存里,十分耗费内存,可以在取出少


量几行时,使用此功能。


举报

相关推荐

0 条评论