游标(cursor):
通俗的说,游标不是查询结果,我们可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口。就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行一行的读文件。客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等!
直接对一个集合调用find()方法时,我们会发现,如果查询结果超过二十条,只会返回二十条的结果。之所以每次显示20条只不过是mongo shell为了提高用户界面可读性而将其限制为20条。在应用程序使用驱动进行交互的时候不会有这个问题。当然你也可以修改这个20的数值。在shell下面输入:
DBQuery.shellBatchSize = 50
就会显示50条一次
![](https://img.haomeiwen.com/i13091615/5969ab2e7d8eadfd.png)
声明游标:
var cursor = db.collectioName.find(query,projection);
Cursor.hasNext() ,判断游标是否已经取到尽头
Cursor. Next() ,取出游标的下1个单元
用while来循环游标
var mycursor = db.bar.find({_id:{$lte:5}})
while(mycursor.hasNext()) {
printjson(mycursor.next());
}
用for来循环游标
var cursor = db.goods.find();
for(var doc=true;cursor.hasNext();) {
printjson(cursor.next());
}
简写:for(var cursor=db.goods.find(), doc=true;cursor.hasNext();) { printjson(cursor.next());}
forEach(回调函数)
游标还有一个迭代函数,允许我们自定义回调函数来逐个处理每个单元.
cursor.forEach(回调函数);
var gettitle = function(obj) {print(obj.goods_name)}
var cursor = db.goods.find();
cursor.forEach(gettitle);
分页:
比如查到10000行,跳过100页,取10行。一般地,我们假设每页N行, 当前是page页,就需要跳过前(page-1)*N行, 再取N行, 在mysql中, limit offset,N来实现。而在mongo中,用skip(), limit()函数来实现的
如var mycursor = db.bar.find().skip(9995);
则是查询结果中,跳过前9995行
如var mytcursor = db.bar.find().skip(9000).limit(10);
则是查询第901页,每页10条
转数组:
通过cursor一次性得到所有数据, 并返回数组.
var cursor = db.goods.find();
printjson(cursor.toArray());//看到所有行
printjson(cursor.toArray()[2]); //看到第2行
注意:不要随意使用toArray() 。会把所有的行立即以对象形式组织在内存里。可以取出少数几行时再用此功能.
网友评论