1.cursor(游標)是什么 ?
通俗的說,游標不是查詢結果,而是查詢的返回資源,或者接口.
通過這個接口,你可以逐條讀取.
就像php中的fopen打開文件,得到一個資源一樣, 通過資源,可以一行一行的讀文件.
2.聲明游標:
var cursor = db.collectioName.find(query,projection);
Cursor.hasNext() ,判斷游標是否已經取到盡頭
Cursor. Next() , 取出游標的下1個單元
3.用while來循環游標
> var mycursor = db.bar.find({_id:{$lte:5}})
> while(mycursor.hasNext()) {
... printjson(mycursor.next());
... }
例:
//插入數據
> for( var i = 0;i<10000 ;i++) {
... db.testcusor.insert({_id:i+1,title:'hello world',content:'xxx'+i});
... };
// 聲明游標
var mycursor = db.testcusor.find();
// 循環游標
for(var doc=true;mycursor.hasNext();) { printjson(mycursor.next());}
或者
> while(mycursor.hasNext()) {
... printjson(mycursor.next());
也可以簡寫:
for(var mycursor=db.testcusor.find(), doc=true;cursor.hasNext();) { mycursor(cursor.next());}
4. 游標還有一個迭代函數,允許我們自定義回調函數來逐個處理每個單元.
cursor.forEach(回調函數);
例:
> var gettitle = function(obj) {print(obj.goods_name)}
> var cursor = db.goods.find();
> cursor.forEach(gettitle);
5.游標在分頁中的應用
比如查到10000行,跳過100頁,取10行.
一般地,我們假設每頁N行, 當前是page頁
就需要跳過前 (page-1)*N 行, 再取N行, 在mysql中, limit offset,N來實現
在mongo中,用skip(), limit()函數來實現的
如 var mycursor = db.bar.find().skip(9995);
則是查詢結果中,跳過前9995行
查詢第901頁,每頁10條
則是 var mytcursor = db.bar.find().skip(9000).limit(10);
6.通過cursor一次性得到所有數據, 並返回數組.
例:
>var cursor = db.goods.find();
> printjson(cursor.toArray()); //看到所有行
> printjson(cursor.toArray()[2]); //看到第2行
注意: 不要隨意使用toArray()
原因: 會把所有的行立即以對象形式組織在內存里.
可以在取出少數幾行時,用此功能.