一、分页

1、limit返回指定条数的数据

2、skip指定跨度

3、limit与skip结合,进行分页

二、排序

1、sort排序:指定排序的key,大于0为升序,小于0为降序。如果指定了多个排序键,比如{age:1, name:-1},则是先按age升序排列,对于age键相等的文档,则按name降序排列。

2、排序的先后:从下图中可以发现,使用sort,始终是先对满足查询条件而查询到的结果集进行排序,然后再进行选取指定的条数或者是跳过指定的条 数。它们的关系就是:在数据库服务器端,先执行sort,然后在排好序的文档上执行skip,最后按照limit设定的最大数量返回文档子集即可。

3、排序的优先级:由于MongoDB的key可以存储不同类型的数据,所以排序是有优先级的,如下图:

优先级从高到低依次为:最小值、null、数字、字符串、对象/文档、数组、二进制、对象ID、布尔、日期、时间戳、正则、最大值。

三、游标

1、如下图所示,查询出某个文档中某个key(假设类型是数组)的元素个数,使用find函数的返回值是一个游标,所以需要用到游标遍历的方式来遍历查询出来的每个文档,而findOne就可以直接输出。

2、find()函数返回一个游标。如果在调用find函数时,不保存返回值,其会自动递归find返回的游标,将前20条数据展示在shell中(输入“it”会继续显示下20条),如下图:

但是如果通过变量保留find函数的返回值,其不会自动进行遍历并显示结果,如果是这样,调用完find后,此时shell并不会去真正地访问数据 库,而是等待开始要求获得结果的时候才向数据库发送查询请求。通过调用游标的hashNext()或next()方法,这样就会真正访问数据库,这是一个 懒加载的过程。如下图:当调用hasNext()时,查询被发往数据库,默认会返回前100条文档或者前4M的数据(两者之中较小的),这样下次next 或hasNext都是本地调用了。当这组数据被遍历完毕,hasNext会再次去访问数据库,直到所有结果被返回。

3、游标到底部就会释放资源,不能再次读取,只能读一遍,如下图:

3、游标的销毁条件:

  • 客户端发来销毁信息。
  • 游标迭代完毕。
  • 默认情况下,游标超过10分钟没用也会被清除。

4、当获得游标后,客户端可以通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任 意键进行排序等,也就是先对游标进行处理后,再让访问数据库的动作按照指定的意愿发生。比如上面分页和排序中使用的limit()、skip()、 sort()等函数,为什么这些函数可以进行链式调用呢?就是因为操作游标的函数返回的都是游标。

四、高级查询选项

1、查询分为普通查询和包装查询,上面演示的各种查询方式都是普通查询,可以将普通查询转换为包装查询,如下图:

2、所有查询在发送到数据库服务器时,都被提前转换成了包装查询,包装查询就是额外使用了一些键,如上图中的"$query"。还有如下一些有用的键可用:

  • $maxscan: integer,指定查询时最多扫描文档的数量。
  • $min: document,查询的开始条件。
  • $max: document,查询的结束条件。
  • $hint: document,指定服务器使用哪些索引进行查询。
  • $explain: boolean,获取查询细节,如用到的索引,结果数量,耗时等,类似于关系数据库中查看执行计划,并不会真正执行查询。
  • $snapshot: boolean,确保查询的结果是在查询执行那一刻的一致快照。
  • $orderby: document,排序,等同于sort()的用法。

五、查询快照

1、从数据库端调用游标的hasNext时,数据库默认会返回100条文档,然后开始操作文档。假设对于一个文档,增大了其大小,并且超过了 MongoDB为文档设置的预留区域,这时将这条文档更新到数据库中,数据库没法将其放置在其原始位置上,只能将其移动,通常会移动到集合末尾!这样使用 游标再次获取文档时,有可能又得到这条被修改过的文档。解决办法就是对查询结果进行快照。就是使用上面提到的“$snapshop”高级查询选项,使用 后,查询就是针对不变的集合视图运行的。但是实际情况中可以不用这样做了,因为MongoDB中,所有返回一组的查询实际都进行了快照。使用如下图:

MongoDB 学习笔记(三):分页、排序与游标的更多相关文章

  1. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  2. MongoDB学习笔记三—增删改文档上

    插入insert 单条插入 > db.foo.insert({"bar":"baz"}) WriteResult({ }) 批量插入 > db.fo ...

  3. Mongodb学习笔记三(Mongodb索引操作及性能测试)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  4. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  5. MongoDB学习笔记三 - MongooseAPI操作数据

    在上一篇我们讲了如何通过Mongoose想数据库动态添加数据, 接下来我们一起来看一下如何通过Mongoose来对数据库进行增删改查等一系列操作 Model 对象的方法 remove(cinditio ...

  6. Mongodb 学习笔记(三) .net core SDK

    首先添加 Nuget包  MongoDB.Driver 创建一个Model. public class Student { public ObjectId _id { get; set; } publ ...

  7. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

  8. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  9. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  10. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

随机推荐

  1. laravel Job 和事件

    在做项目的时候,一直对Job和Event有个疑惑.感觉两者是相同的东西,搞不清楚两者的区别在哪里!经过一段时间的琢磨和查找了相关的资料,对Job和Event做了一些总结,以便记忆. Job Job既可 ...

  2. WEB测试范围小结

    根据<用户需求说明手册>和<需求分析说明书>,分析各个功能模块.针对各个功能模块进行相关功能的测试. 链接测试 链接是Web 网站的一个主要特征,它是在页面之间切换和引导用户去 ...

  3. Spring Boot-定义拦截器(七)

    在web项目 我们常常使用拦截器做权限验证和登陆验证 1.创建一个拦截器实现类 标注@Componet @Component public class LoginInterceputer implem ...

  4. CodeForces - 9B - Running Student

    先上题目: B. Running Student time limit per test 1 second memory limit per test 64 megabytes   And again ...

  5. ASP.NET--IIS的Http请求流程

    下面的文章是基于IIS经典模式给出的流程图,和IIS集成模式有些区别,WIN7系统自带的是IIS7,和文章分写的有些区别,现在基本上都用IIS7了,所以不要入坑 伯乐在线的文章一 伯乐在线的文章二

  6. 【微信小程序】:小程序,新场景

    前言: 我们频繁进入的地方,是场景. 手机.是场景:浏览器.是场景.事实上,微信,也是场景-- 微信要做的是占领很多其它用户时间.占领很多其它应用场景.占领很多其它服务入口.这是商业本质想去垄断要做的 ...

  7. Java中的事务

    Java中的事务 学习了:https://www.cnblogs.com/chengpeng15/p/5802930.html 膜拜一下 org 分为三类:jdbc事务.jta事务.容器事务:

  8. formValidator向struts2 ajax传參验证

    话不多说,直接上代码 页面head里面的formvalidator验证配置 <script type="text/javascript"> $(document).re ...

  9. 用python阐释工作量证明(proof of work)

    了解比特币的都知道挖矿非常耗电,这是由于比特币用到了工作量证明. 工作量证明是指系统为达到某目标而设置的工作度量方法.一開始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了. 工作量证明须 ...

  10. Ubuntu使用ssh方法连接不上

    查看远程机器是否安装ssh服务(ubuntu 没有默认安装ssh) 命令:ssh host  (图中没有安装) 安装ssh  命令 sudo apt-get install openssh-serve ...