或者
forEach()循环遍历:
>cursor.forEach( function(doc) { printjson(doc);});
当你遍历游标到返回的批处理结束,如果有更多的结果,cursor.next()将执行更多的操作来获取下一批。
MongoDB服务器返回的查询结果, 当调用cursor.hasNext()时,MongoDB批量的大小不会超过最大BSON文档大小,然而对于大多数查询,第一批返回101文档或足够的文件超过1 MB,后续的批大小为4 MB。如果第一批是返回101个文档时,遍历完时,执行hasNext,会到 数据库查询结果,直到所有结果都被返回,游标才会结关闭。
我们可以通过可以使用objsleftinbatch()方法来查看,每次返回文档数量或者大小,如下面的例子:
>var cursor=db.items.find() >cursor .objsLeftInBatch();
当我们刚执行查询时,执行cursor .objsLeftInBatch();方法会显示101 ,这说明第一批返回101文档(101文档没超过1MB)
我们遍历完101个文档时,当我们执行cursor.hasNext()时,第二批会在返回101文档吗?
我们先遍历完101个文档,如下面的例子:
>for(vari=0;i<101;i++){
var doc = cursor.next();
printjson(doc);
}
这时我们迭代完第一批返回的结果,我们在执行cursor.hasNext();时,会到数据库查询下一批结果,我们objsLeftInBatch方法查看返回文档大小,如下面的例子:
>cursor.hasNext(); >cursor .objsLeftInBatch();
这时返回的结果是 9899, 不在是101个文档,而是4 MB,我们9899个文档没达到4MB,所有全部返回。
说明:
MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用。查询时,实现分批次返回结果,这是一个懒加载的过程,需要时才到数据库查询下一批结果,这会节省资源,不会浪费资源。
三、游标的操作
我们还可以对文档的游标,可以随意修改返回结果的限制、跳跃、和排序顺序的功能。1. limit
limit方法是限制游标返回结果的数量,如下面例子:
>db.items.find().limit(5)
只返回结果5条文档
2.sort
sort()方法来对数据进行排序,根据指定的字段,并使用1或-1来指定排序方式是升序或降序,类似于SQL的order by。
例子:
>db.items.find({"ino":{$lt:5}}).sort({"quantity":-1})
我们查询ino小于5,并对这结果进行排序,按quantity字段降序。
我们可以指定多个字段排序,例如我们先按quantity字段降序,然后在按info升序,如下面的例子:
>db.items.find({"ino":{$lt:5}}).sort({"quantity":-1,"info":1})
我们查询ino小于5,并对这结果进行排序,按quantity字段降序
我们还可以跟limit()方法进行组合查询并对结果进行排序
例子:
>db.items.find().limit(3).sort({"quantity":1})
我们先根据quantity字段升序并返回前3条记录,发现没有键quantity(即键quantity值为null)的文档排在了前面,这是在MongoDB中,当比较不同类型值BSON,MongoDB使用以下比较顺序,从最低到最高:
MinKey (internal type)
Null
Numbers (ints, longs, doubles)
Symbol, String
Object
Array
BinData
ObjectId
Boolean
Date
Timestamp
Regular Expression
MaxKey (internal type)
对于包括一个没有索引的排序操作的查询,服务器必须在返回任何结果之前将所有的文档加载到内存中来进行排序。
3、skip
skip方法可以跳过指定值的条数,返回剩下的条数的结果,可以跟limit()方法进行组合可以实现分页的效果。
?
例子:
?
>db.items.find().skip(10).limit(10)
?

跳过第10条,从第11条开始返回,只返回10条文档.
skip方法是跳过条数,而且是一条一条的跳过,如果集合比较大时(如书页数很多)skip会越来越慢, 需要更多的处理器(CPU),这会影响性能。
我们可以通过一个键值比较有顺序的来进行分页,这样就避免使用skip方法。
?
例子:
?
>db.items.find({"ino":{$lt:20,$gt:9}}).sort({"info":1})
?

?
?
四、游标的说明
?
默认情况下,服务器将自动关闭该游标10分钟后闲置或客户端遍历完结果的游标。需要手动关闭游标或清除游标是,可以在查询中使用光标指定noTimeout标记。通过 cursor.addOption(),通过这个方法,如下面的例子:
?
>var cursor = db.items.find().addOption(DBQuery.Option.noTimeout);
?
可以查看游标信息:
?
(1) 打开的游标的总数
(2)当前客户端使用的游标大小
(3)自上次重新启动服务器的超时游标数量
我们可以查看,了解游标使用情况
如下面的例子:
?
>db.serverStatus().metrics.cursor
?

?
?