一、分页

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. Linux—Ubuntu14.0.5安装mongo

    1.安装mongo sudo apt-get install mongo 2.如果遇到找不到安装包运行,那就更新资源列表 sudo apt-get update 3.安装成功会自动运行mongo pg ...

  2. python项目开发:ftp server开发

    程序要求: 1.用户加密认证 (对用户名密码进行MD5验证)2.允许同时多用户登陆 (使用socket server方法,为每个用户都创建一个信息文件)3.每个用户有自己的家目录,且只能访问自己的家目 ...

  3. SCU - 4110 - PE class

    先上题目: 4110: PE class Submit your solution     Discuss this problem     Best solutions   Description ...

  4. linux下apache2更换目录

    修改apache2的默认文档目录(默认是在/var/www) 修改命令:sudo gedit /etc/apache2/sites-enabled/000-default 在文档中找到 Documen ...

  5. Linux 3.14 待机流程分析

    1:待机节点创建 static int __init pm_init(void) { int error = pm_start_workqueue(); if (error) return error ...

  6. iOS项目开发实战——使用Xcode6设计自己定义控件与图形

    在iOS开发中,有很多控件都是Xcode默认提供的.使用这些控件是很方便的.可是因为某些须要.须要自己设计控件,那么应该怎么做呢?在Xcode6中提供了这种接口,同意开发人员高速开发自己定义控件,而且 ...

  7. linux命令之man和info

    linux命令之man和info man ➜ ~ man ls result: LS(1)中1这样的数字的意义例如以下所看到的: 代号 内容 1 用户在shell环境中能够操作的命令或可运行文件 2 ...

  8. elasticsearch插件开发

    检索引擎Elasticsearch支持插件模式.有些时候你可能须要安装一些插件.甚至自己开发插件,这里就提供一个開始ES插件开发演示样例,ES版本号为1.5.2. 一.插件类继承自org.elasti ...

  9. 错误: su: 无法设置组: 不允许的操作

    到 /bin目录下,用ls -l 看下su文件的权限是不是rwxr-xr-x或者-rwxrwxrwx 执行这条命令chmod ug+s su

  10. <vim实用技巧>学习笔记

    第三章插入模式 1.插入模式下的删除  2.返回普通模式                                 3.复制 yt, //复制当前光标到逗号(,)之前的内容 第四章 可视模式 1 ...