MongoDB的引用哲学 --- 游标

(1)游标介绍

如果我们查询的数据量比较大会怎样?

我们首先插入10000条数据,因为mongodb底层是javascript引擎,所以我们

可以使用js的语法来插入数据:

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

效果:

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

事实上在日常的业务中,很少有一次性取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方法会把所有

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

量几行时,使用此功能。

原文链接:https://blog.csdn.net/acmman/article/details/54426116

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏与神兽党一起成长

使用commons-pool管理FTP连接

在封装一个FTP工具类文章,已经完成一版对FTP连接的管理,设计了模板方法,为工具类上传和下载文件方法的提供获取对象和释放对象支持。

1372
来自专栏猿人谷

unix共享内存要点

共享内存优点:     1.在进程之间不通过内核传递数据,即不通过系统调用拷贝数据,达到快速,高效的数据传输。     2.随内核持续     *nix的共享内...

18410
来自专栏技巅

Thrift之代码生成器Compiler原理及源码详细解析1

1625
来自专栏陈树义

从字节码层面,解析 Java 布尔型的实现原理

最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型?

1502
来自专栏Janti

JVM活学活用——类加载机制

类的实例化过程 ---- 有父类的情况 1. 加载父类静态     1.1 为静态属性分配存储空间并赋初始值     1.2 执行静态初始化块和静态初始化...

4088
来自专栏青玉伏案

ReactiveSwift源码解析(十二) MutableProperty基本代码实现

前两篇博客我们分别聊了ReactiveSwift框架中的负责标记对象的生命周期的类Lifetime以及负责原子性操作的Atomic类的具体代码实现。前两篇博客之...

1925
来自专栏技术专栏

慕课网Flask高级编程实战-4.flask核心机制

在 3.8节我们通过db.create_all(app=app)的方式解决了working outside application context的错误,下面我...

3433
来自专栏IT派

爬虫工程师面试题总结,带你入门Python爬虫

4383
来自专栏码农笔录

Failed to resolve directive: el vue2报错

1382
来自专栏企鹅号快讯

PHP高级特性之反射

反射-Reflection 面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。 反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对...

2729

扫码关注云+社区

领取腾讯云代金券