理解MongoDB的游标有两种维度:客户端和服务器端。下面将从这两方面来说明。

客户端

find方法返回值是一个游标。可以通过游标来对最终结果进行控制。比如限制结果数量,略过某一部分,根据任意键按任意顺序的组合对结果进行各种排序等。

创建游标

创建一个游标非常简单,用一个局部变量接收结果集就可以了。

var cursor=db.collection.find();

迭代

要迭代结果可以使用游标的next方法。也可以使用hasNext来查看结果中是否还有下一个记录(这里和C#集合很像)。

var obj;

while(cursor.hasNext()){

obj=cursor.next()

//do stuff

}

游标还实现了Javascript的迭代器接口,所以可以在foreach循环中使用(好熟悉):

cursor.forEach(function(x){

print(x.name)

})

在调用find时,MongoDB shell并不立即查询数据库,而是在等待真正开始获取数据时才发送查询。(类似Linq中IQueryable)。例如执行下面操作:

cursor.hasNext();

这时,查询才会发往服务器。shell立刻获取前100个结果或前4MB数据,这样下次再调用hasNext或next时就不必再连接服务器取结果了。当客户端用完第一次取得的结果时,shell会再一次连接服务器,返回下一次结果。如果继续执行next或hasNext方法的话就会一直获取直到把集合遍历尽为止。

服务器端

游标生命周期

游标会消耗一定的内存和资源,一般游标遍历完以后,或客户端发来终止消息是,MongoDB会释放这些资源供其他地方使用。所以要尽量保证尽快地释放游标。

如果一个游标已经不再作用域内或超出10分没有被使用的话,客户端就会向服务器发送一条特殊的消息,来告诉服务器销毁游标。这样的话大大减少了服务器的负担,MongoDB不用维护成千上万个打开却不使用的游标了。

有时这种“超时销毁”行为是我们希望的。然而,有时我们希望延长游标的持续时间。若是如此的话,可以使用immortal函数来实现延长游标持续时间。这时要注意,一定要在迭代完结果时,主动销毁游标,以确保游标被关闭。否则的话它会一直消耗服务器资源。

MongoDB学习笔记-游标的更多相关文章

  1. PHP操作MongoDB学习笔记

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

  2. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

  3. MongoDB学习笔记系列

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

  4. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  5. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  6. MongoDB学习笔记(转)

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

  7. MongoDB学习笔记(六)--复制集+sharding分片 && 总结

    复制集+sharding分片                                                               背景 主机 IP 服务及端口 Server A ...

  8. MongoDB学习笔记(五)--复制集 && sharding分片

    主从复制                                                                                       主从节点开启 主节 ...

  9. MongoDB学习笔记(四)--索引 && 性能优化

    索引                                                                                             基础索引 ...

随机推荐

  1. Leetcode001 two sum

    /* c++ STL is much nore than what i think before in these aspects: * initializer for node element in ...

  2. 解决Android sdk更新不能下载或下载内容过慢

    Android Android SDK 配置步骤 启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manag ...

  3. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

  4. 来,让我们谈一谈Normalize.css

    本文译自 http://nicolasgallagher.com/about-normalize-css/最初发布于我的博客:http://jerryzou.com/posts/aboutNormal ...

  5. 使用javascript取得网站的根路径

    //Javascript获取站点获得根目录绝对路径 function getRootPath() { //完整路径 var strFullPath = window.document.location ...

  6. C#关于一个程序,只可以有一种实例的方法

    方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 说明:程序中通过语句 System.Threading.Mutex ru ...

  7. [leetcode]_Count and Say

    题目:一开始没看懂, 后头经过WA发现 输出 的意义 是 出现的次数+值. 1 => 一个1 => 11 11 => 两个1 => 21 111=> 三个1 => ...

  8. Linux下的Source命令及脚本的执行方式解析

    Linux Source命令及脚本的执行方式解析 http://blog.csdn.net/wangyangkobe/article/details/6595143 当我修改了/etc/profile ...

  9. 登录成功返回登录前页面js代码

    /*------ setCookie(name,value) -----------*/ function setCookie(name,value) { var Days = 30; //此 coo ...

  10. PHP多例模式

    学习java就知道设计模式中有多例模式: 1.多例类可以有多个实例2.多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例. 大家都知道PHP单例模式,却很少说PHP多例模式,下面是在wik ...