通俗的說,遊標不是查詢結果,能夠理解爲數據在遍歷過程當中的內部指針,其返回的是一個資源,或者說數據讀取接口.
客戶端經過對遊標進行一些設置就能對查詢結果進行有效地控制,如能夠限制查詢獲得的結果數量、跳過部分結果、或對結果集按任意鍵進行排序等!
直接對一個集合調用find()方法時,咱們會發現,若是查詢結果超過二十條,只會返回二十條的結果,這是由於Mongodb會自動遞歸find() 返回的遊標。javascript
當咱們使用一個變量來保存 find()的返回值時,其將不會自動進行遍歷顯示查詢結果的操做,並無真正的去查詢數據庫,只要當用到的時候(也就是遍歷遊標的時候)纔會到數據庫中將數據取出來,和PHP連接mysql資源同樣:php
php代碼
java
$result = mysql_query('select * from message'); //返回的是一個資源 $row=mysql_fetch_assoc($result);//返回sql查詢的數組(僅爲知足條件的第一條),其內部就有一個指針遊標,能夠經過循環反覆的取出數據 while($f=mysql_fetch_assoc($result)){//每循環一次遊標就前進一次,遊標走到尾的時候,就不返回值了 $row[]=$f; } var_dump($row);
mongoDB代碼(js)
mysql
// while循環 var cursor = db.goods.find({goods_id:{$lte:20}},{_id:0,goods_id:1}); //使用變量來保存遊標 while(cursor.hasNext()){ //cursor.hasNext()判斷遊標是否取到盡頭 printjson(cursor.next()); //cursor.next()取出遊標的下1個單元(從0開始遊),注意print打印的是二進制對象,printjson打印出來的纔是可閱讀的json格式數據 } // for循環 var cursor = db.goods.find({goods_id:{$lte:100}},{_id:0,goods_id:1}); //使用變量來保存遊標 for (;cursor.hasNext();) { //因爲cursor.hasNext()自動判斷的特性這裏的for循環能夠很簡單 printjson(cursor.next()); } //forEach循環 var cursor = db.goods.find({goods_id:{$lte:100}},{_id:0,goods_id:1,goods_name:1}); var callback = function(obj){ //obj就是查出的文檔對象 printjson(obj.goods_id) //直接取出goods_id的值; } cursor.forEach(callback);
好比查到10000行,跳過100頁,取10行.通常地,咱們假設每頁N行, 當前是page頁,就須要跳過前 (page-1)*N 行, 再取N行, 在mysql中, limit offset,N來實現sql
在mongo中,用skip(), limit()函數來實現的,當得到遊標後,咱們能夠先對遊標進行處理後,再讓訪問數據庫的動做按照咱們的意願發生。在這裏咱們就可使用limit,skip,sort三個函數來處理遊標。同時這三個函數能夠組成方法鏈式調用的形式。數據庫
limit:限制遊標返回的數量,指定了上限 skip:忽略前面的部分文檔,若是文檔總數量小於忽略的數量,則返回空集合 sort:獲得的子集合進行排序,能夠按照多個鍵進行正反排序!
# 查詢5條 > var cursor = db.goods.find({},{_id:0,goods_id:1}).limit(5); //注意,再次使用遊標的時候,遊標得重置,由於使用過一次就游到最後了; > cursor.forEach(function(obj){print(obj.goods_id);}) # 查詢5條,並按照shop_price的降序排列 > var cursor = db.goods.find({},{_id:0,goods_id:1,shop_price:1}).limit(5).sort({shop_price:-1}) > cursor.forEach(function(obj){ print(obj.goods_id+' '+obj.shop_price) }) 22 5999 23 3700 32 3010 18 2878 14 2625 # 每頁10條取第二頁,而且升序排列 var cursor = db.goods.find({},{_id:0,goods_id:1,shop_price:1}).limit(10).sort({goods_id:1}).skip(10) cursor.forEach(function(obj){ print(obj.goods_id+' '+obj.shop_price) }) # 一次性打印全部的行,以易讀的模式 var cursor = db.goods.find({},{_id:0,goods_id:1,shop_price:1}); printjson(cursor.toArray()); /* 注意: 不要隨意使用toArray() 緣由: 會把全部的行當即以對象形式組織在內存裏.能夠在取出少數幾行時,用此功能. */