一、分页

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. HashMap源码分析笔记(一)

    一.结构 HashMap的结构由数组和链表组成,可以说是一个链表类型的数组: 快速定位方式:key值得hash变换作为数组索引快速找到对应数组块,之后通过hash值对比从链表中查找到匹配项. hash ...

  2. AnimationEvent事件问题

    AnimationEvent事件问题 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/deta ...

  3. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后第4,5个点常数变大很多,于是喜提UOJ全站倒数第三 目前还不知道原来的写法为什 ...

  4. 【ZOJ 4060】Flippy Sequence

    [链接] 我是链接,点我呀:) [题意] [题解] 按照两个区间的排列方式 我们可以分成以下几种情况 会发现这两个区间的作用 最多只能把两段连续不同的区间变为相同. 那么写个for处理出连续不相同的一 ...

  5. FZU - 2062 - Suneast & Yayamao

    先上题目: Problem 2062 Suneast & Yayamao Accept: 146    Submit: 319Time Limit: 1000 mSec    Memory L ...

  6. ZOJ 1654--Place the Robots【二分匹配 &amp;&amp; 经典建图】

    Place the Robots Time Limit: 5 Seconds      Memory Limit: 32768 KB Robert is a famous engineer. One ...

  7. oc16--set,get

    // // Kline.h // day13 #import <Foundation/Foundation.h> @interface Kline : NSObject { int _ma ...

  8. win7浏览器出现无法连接到代理服务器错误解决办法

    今天早上打开电脑浏览器显示无法连接到代理服务器 解决办法: 1.Google浏览器 2.打开设置->高级设置->打开代理服务器->局域网设置,把对勾去掉 3.点击确定,关闭浏览器重新 ...

  9. EOJ 1114 素数环

    题意 一个由自然数 1…n (n≤18) 素数环就是如下图所示,环上任意两个节点上数值之和为素数. 1 / \   4  2 \ /    3 Input 输入只有一个数 n,表示你需要建立一个 1… ...

  10. [.Net] DataTable添加列和行的三种方法

    #region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc = tblData ...