理解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. keepalive实现web服务器active/passive

    https://github.com/acassen/keepalived/blob/v1.2.13/doc/keepalived.conf.SYNOPSIS http://ngyuki.hatena ...

  2. 二级路由器设置为何要关闭DHCP服务

    因为如果不关闭dhcp的话会和一级路由相冲突,你这个因该是lan口的连接法吧,如果不然的话是不需要关闭dhcp功能的路由器和路由器的连接方法有两种,一种是wan口连,一种是lan口连方法1:WAN口连 ...

  3. C\C++ 框架和库整理(转)

    [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...

  4. [原]sdut2624 Contest Print Server (大水+大坑)山东省第四届ACM省赛

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&am ...

  5. wpf仿QQ之窗体翻转

    很久以前在网上找过窗体翻转的Demo,但看得不是很明白,大多是内容的翻转,研究了下,现在分享给大家. 利用UIElement.RenderTransform 属性就能实现元素的呈现位置的转换,因此只需 ...

  6. Web服务器控件表

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAAFRCAIAAAD/5nW4AAAgAElEQVR4nOydd3gVxfrHN6TXQ0KXEn

  7. subpage和secondary page的区别

    Hi,  Can you tell me the differences between subpage and secondary  page and when to use which ? I n ...

  8. ajax翻页效果模仿yii框架

    ajax翻页效果,模仿yii框架. 复制代码代码如下: <!DOCTYPE html>  <html>  <head>  <title>ajax分页_w ...

  9. Sublime Text2 注册码 汉化 配置lua开发环境

    1.注册  help --> Enter License ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-8556 ...

  10. Java 第七天 动态代理

    代理类需实现InvocationHandler接口: public interface InvocationHandler { public Object invoke(Object proxy,Me ...