MongoDB 游标与分页_mongocursor 分页-程序员宅基地

技术标签: MongoDB  

说明:本篇文章主要介绍MongoDB 中游标(cursor)的使用,以及使用 skip() 与 limit() 函数实现分页,最后讲解 sort() 函数进行排序。

MongoDB 游标(cursor)

所谓游标就是指的是数据可以一行行的进行操作,非常类似于 ResultSet(java中的数据对象) 数据处理。在 MongoDB 中对于游标的处理也比较简单,只需要使用 find() 函数就可以返回游标。

声明游标

// 获取游标
var cursor = db.collection.find({});

// 判断是否还有下一行数据
cursor.hasNext();

// 获取当前文档数据
cursor.next()

示例:使用循环来操作

var obj;
var cursor = db.collection.find();
while( cursor.hasNext() ){
    obj = cursor.next();
    // todo 
    ...
}

示例:使用 javaScript 中的 forEach 迭代数据

var obj;
var cursor = db.collection.find();
cursor.forEach(function(item){
    // todo
    ...
})

游标的生命周期

游标会消耗一定的内存和资源,下面几种情况会释放游标占用的资源

  • 游标遍历完成以后
  • 客户端发送终止消息
  • 游标超过 10 分钟没有被使用

 

MongoDB 分页

MongoDB 分页需要使用到的两个函数 limit() skip() ,如果我们需要排序,就可以使用 sort() 函数

limit: 限制游标返回的数量,指定了上限 
skip: 忽略前面的部分文档,如果文档总数量小于忽略的数量,则返回空集合 
sort: 得到的子集合进行排序,可以按照多个键进行正反排序!

limit()skip() 的使用

示例:只查询前面 50 条数据

db.collection.find().limit(50);

示例:跳过前面 50条数据

db.collection.find().skip(50);

sort() 函数的使用

要进行排序使用 sort,对应的 key 值为 1 升序,-1 为降序

示例:使按照 价格 price 从高到低 排序。

db.collection.find().sort({price: 1});

示例:使用 price 和 name 两个字段都是升序排序

db.collection.find().sort({price: 1, name: 1});

分页实现

第一种方法:数据量比较少的时候可以使用这种。

// 查询第一页的数据
db.test.find().sort({"price":1}).limit(20);

// 查询第二页的数据
db.test.find().sort({"price":1}).limit(20).skip(20);

// 后面的数据就依次类推
db.test.find().sort({"price":1}).limit(20).skip(40);
...

第二方式:因为 skip() 函数比较消耗资源,所以下面的方式避开使用 skip () 操作。

// 取到第一页数据
var page1 = db.test.find().sort({"price":1}).limit(20);
var latest ;
// 判读是否有下一页数据
while( page1.hasNext() ){
    latest = page1.next();
}

// 查询下一页的数据
db.test.find({"price": {"$gt": latest.price}  }).sort({"price":1}).limit(20);

对于这种操作就需要记录当前记录的那个值,然后每次取大于这值后面一页的数据,此时是避免使用 skip() 函数,效率高一些。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_18948359/article/details/88637529

智能推荐

小程序开发商该怎么选-程序员宅基地

文章浏览阅读208次。  小木最近收到很多关于小程序开发制作的相关问题,其中“小程序开发商该怎么选?”这个问题被频繁提及,市面上那么多家小程序开发商,该怎么选?选择时应该注意哪些问题?小木整理汇总了以下几个衡量标准,供大家参考。    1、实力    这个不难理解,有实力的企业自然在团队、产品、服务等方面都更具优势。那我们怎么去判断一家开发商的实力怎么样?可以从开发商成立时间、团队人员、服务客户数量等硬性配置水平方面以及一些获奖证书等来了解公司规模和资质实力,正规的开发商都会有官网,我们可以从上面进行了解,如._小程序开发商该怎么选

ubuntu18.04安装sqlserver2019_sql sever2019安装包-程序员宅基地

文章浏览阅读628次,点赞8次,收藏8次。【代码】ubuntu18.04安装sqlserver2019。_sql sever2019安装包

rime输入法初识----sample目录插件与样例分析(二)_rime脚本-程序员宅基地

文章浏览阅读405次。2021SC@SDUSC今天讲讲sample中cmake的集成方式构建为标准的 Rime 插件与按照 librime 的 cmake 脚本中的特定规则构建的示例不同,标准 Rime 插件是独立的项目,可以自动集成到 librime 的构建系统中,而无需修改任何源代码和构建脚本。要将示例插件构建为标准 Rime 插件,将源代码目录链接或复制到 plugins/sample 并关闭 cmake 标志 BUILD_SAMPLE=OFF。https://github.com/rime/libri._rime脚本

[LIBGDX学习]LibGDX代码详解(九)Box2D revolute joint_box2d revolutejoint-程序员宅基地

文章浏览阅读217次。import com.badlogic.gdx.math.Vector2;import com.badlogic.gdx.physics.box2d.Body;import com.badlogic.gdx.physics.box2d.BodyDef;import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;import com.badl..._box2d revolutejoint

ztree与layui的结合,用layui的$代替jquery.js文件-程序员宅基地

文章浏览阅读4.6k次。layui自身集成了jquery,所以想用$符号不用再引入jquery.js文件,只要声明jquery的模块就好了。例如:然后就可以像使用jquery那样使用$符号了但是呢,ztree树状图这里有用到jquery的jQuery,我们直接声明$符号来用会导致ztree某些引用jQuery变量的地方会报错。我也试过var $ = layui.$;var jQuery= layu...

【数据结构】串的模式匹配:简单的模式匹配算法,KMP算法_简单模式匹配时间复杂度-程序员宅基地

文章浏览阅读1k次,点赞4次,收藏10次。简单模式匹配算法;KMP算法;求next数组_简单模式匹配时间复杂度

随便推点

并发队列Queue使用场景总结_queueutils使用场景-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏8次。并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结 三者区别与联系: 联系,三者 都是线程安全的。区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理;后2者采用锁机制,所以是阻塞的。注意点就是前者由于采用cas算法,虽然能高并发,但cas的特点..._queueutils使用场景

天梯赛-玩转二叉树_天梯 玩转二叉树-程序员宅基地

文章浏览阅读224次。L2-011 玩转二叉树 (25分)给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:71 2 3 4 5 6 74 1 3 2_天梯 玩转二叉树

【IOS-Swift】实战笔记——数据持久化之NSUserDefaults(本地轻量级数据存储)_swift 持久化存储登录信息-程序员宅基地

文章浏览阅读2.1k次。NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息咯。因为如果使用自己建立的plist文件什么的,还得自己显示创建文件,读取文件,很麻烦,而是用NSUserDefaults则不用管这些东西,就像读字符串一样,直接_swift 持久化存储登录信息

mybatis分页拦截器可以传递参数(可以复制直接使用)_mybatis page 复制 page-程序员宅基地

文章浏览阅读7.1k次,点赞5次,收藏8次。总目录 1.在spring-mybatis.xml配置拦截器的代码 2.在controller层的代码(使用map传递自定义参数) 3.分页拦截器代码 4.page类 可以复制直接使用_mybatis page 复制 page

IOT-OS之RT-Thread(十四)--- AT命令集 + ESP8266 WiFi模块-程序员宅基地

文章浏览阅读8.3k次,点赞10次,收藏58次。一、AT命令集简介AT 命令(Attention Commands)作为主芯片和通讯模块的协议接口,广泛应用于嵌入式开发领域,比如GPRS模块、3G 模块、WiFi/蓝牙/GPS模块等,这些网络扩展模块的硬件接口一般为串口,这样主控设备可以通过简单的命令和硬件设计实现多种网络服务功能。 为了方便用户使用 AT 命令,简单的适配不同的 AT 模块, RT-Thread 提供了 AT 组件用于 AT 设备的连接和数据通讯。二、ESP8266 WiFi模块简介三、AT组件实现原理与ESP8266模块移植

如何查看HTML元素的TS类型_根据html元素获取类型-程序员宅基地

文章浏览阅读485次,点赞9次,收藏10次。5.打印出来的最后一项[[Prototype]]的值就是该元素的ts类型。3.在开发者调试页面的`Elements`中找到对应的标签,并点击选中。1.用谷歌浏览器随便打开一个网页,2.鼠标右击->检查。_根据html元素获取类型