MongoDB的引用哲學 --- 遊標

(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方法會把所有

的行立即以對象的形式組織在內存裏,十分耗費內存,可以在取出少

量幾行時,使用此功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章