一、分页

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. Pycharm中Git、Github的简单使用和配置

    Pycharm中Git.Github的使用 PyCharm本身自带了git,稍微配置一下就可以很好的在图形界面下进行Python项目的版本控制 配置Git 在配置前先新建一个项目,当然也可以打开已有的 ...

  2. python3实现UDP协议的简单服务器和客户端

    利用python中的socket模块中的来实现UDP协议,这里写一个简单的服务器和客户端.为了说明网络编程中UDP的应用,这里就不写图形化了,在两台电脑上分别打开UDP的客户端和服务端就可以了. UD ...

  3. 【codeforces 793D】Presents in Bankopolis

    [题目链接]:http://codeforces.com/contest/793/problem/D [题意] 给你n个点, 这n个点 从左到右1..n依序排; 然后给你m条有向边; 然后让你从中选出 ...

  4. App后台开发运维和架构实践学习总结(1)——App后台核心技术之用户验证方案

    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.使用Token进行身份鉴权 ...

  5. Mahmoud and a Dictionary

    Mahmoud and a Dictionary time limit per test 4 seconds memory limit per test 256 megabytes input sta ...

  6. Linux去重命令uniq(转)

    注意:需要先排序sort才能使用去重. Linux uniq命令用于检查及删除文本文件中重复出现的行列. uniq可检查文本文件中重复出现的行列. 语法 uniq [-cdu][-f<栏位> ...

  7. OSX: 安装打印机的有用命令行

    事实上非常easy.就是有用lpadmin命令,以下给出一个样例: printername="YOUR_PRINTER_NAME" location="LOCATION ...

  8. Exchanger源代码剖析

    Exchanger是一个针对线程可以结对交换元素的同步器.每条线程把某个对象作为參数调用exchange方法,与伙伴线程进行匹配.然后再函数返回的时接收伙伴的对象.另外.Exchanger内部实现採用 ...

  9. 黑马day07 登录注冊案例(一)

    简单介绍:依据三层架构的思想设计本案例. 1.搭建好开发环境 准备好须要的包和模拟数据库配置文件users.xml -->cn.itheima.dao -->cn.itheima.serv ...

  10. iWatch报错: Authorization request cancled

    iWatch报错: Optional (Error Domin = com.apple.healthkit Code = 5 "Autherization request canceled& ...