(1)遊標介紹
如果我們查詢的數據量比較大會怎樣?
我們首先插入10000條數據,因爲mongodb底層是javascript引擎,所以我們
可以使用js的語法來插入數據:
for(var i=0;i<10000;i++){ db.bar.insert({_id:i+1,title:'helloWorld',content:'aaa'+i}); };
效果:
我們查詢一下,確實是插入進去了:
事實上在日常的業務中,很少有一次性取10000條數據的,但是有時候
從數據庫取出來的數據是跨數據的,比如取第100頁的數據。我們查詢
的時候不想一次性取出那麼多數據,想進行逐條處理,這個時候我們就
需要使用“遊標(cursor)”來解決。
什麼是“遊標”?
通俗的說,遊標不是查詢結果,而是查詢的一個返回資源或者接口,通過
這個接口,可以逐條讀取數據。
就類似java中的讀取流一樣,使用包裝類的readLine()方法一行一行去讀。
(2)遊標使用語法
聲明遊標:
var cursor=db.collectionName.find({filed:value,...});
find的查詢結果賦值給了遊標cursor變量。
我們獲取我們剛剛插入的10000條數據的遊標對象(條件是_id<=5),然後分別打
印所有數據的信息:
其中next()方法就是取出下一個數據。printjson就是以json格式打印出數據。
同樣也可以使用js的while語法來循環打印剛剛的數據:
當然也可以使用for循環來打印:
還有一個比較常用的方法,叫“forEach”,每一個forEach裏面有一個
回調函數,這個函數中的obj對象就是遊標指向的數據集的每一個數據。
這個方法給了我們很大的自由度,可以在回調函數中做一些我們想做的操作。
(3)遊標在數據庫的應用
遊標在分頁時如何使用?
例如查詢到10000行,跳過100頁,取10行。
一般的,我們假設每頁N行,當前是page頁,就需要跳過(page-1)*N行,
再取N行。在Mysql中,我們可以使用limit offset,N來實現。
在mongodb中,使用skip(),limit()函數來實現。
我們取出我們10000條數據的第9996-10000條的數據,可以使用skip()
函數來實現:
可以使用limit限制取出的數據條數,
我們查詢第801頁,每頁10條:
同理,也可以在查詢的時候使用分頁方法:
如果我們不想迭代打印,想直接把結果以數組的形式打印出來,
使用遊標的toArray()方法:
想取出某一個,使用數組的下標即可:
這裏要提醒大家的是,如果查詢少量的數據,可以使用toArray方法,
查詢大量的數據不建議使用toArray方法,因爲toArray方法會把所有
的行立即以對象的形式組織在內存裏,十分耗費內存,可以在取出少
量幾行時,使用此功能。