国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【mongoDB中級篇①】游標(biāo)cursor

AZmake / 3395人閱讀

摘要:在這里我們就可以使用,,三個(gè)函數(shù)來處理游標(biāo)。同時(shí)這三個(gè)函數(shù)可以組成方法鏈?zhǔn)秸{(diào)用的形式。

簡述

通俗的說,游標(biāo)不是查詢結(jié)果,可以理解為數(shù)據(jù)在遍歷過程中的內(nèi)部指針,其返回的是一個(gè)資源,或者說數(shù)據(jù)讀取接口.
客戶端通過對游標(biāo)進(jìn)行一些設(shè)置就能對查詢結(jié)果進(jìn)行有效地控制,如可以限制查詢得到的結(jié)果數(shù)量、跳過部分結(jié)果、或?qū)Y(jié)果集按任意鍵進(jìn)行排序等!
直接對一個(gè)集合調(diào)用find()方法時(shí),我們會發(fā)現(xiàn),如果查詢結(jié)果超過二十條,只會返回二十條的結(jié)果,這是因?yàn)镸ongodb會自動(dòng)遞歸find() 返回的游標(biāo)。

基本操作

當(dāng)我們使用一個(gè)變量來保存 find()的返回值時(shí),其將不會自動(dòng)進(jìn)行遍歷顯示查詢結(jié)果的操作,并沒有真正的去查詢數(shù)據(jù)庫,只要當(dāng)用到的時(shí)候(也就是遍歷游標(biāo)的時(shí)候)才會到數(shù)據(jù)庫中將數(shù)據(jù)取出來,和PHP鏈接mysql資源一樣:

php代碼

$result = mysql_query("select * from message"); //返回的是一個(gè)資源

$row=mysql_fetch_assoc($result);//返回sql查詢的數(shù)組(僅為滿足條件的第一條),其內(nèi)部就有一個(gè)指針游標(biāo),可以通過循環(huán)反復(fù)的取出數(shù)據(jù)

while($f=mysql_fetch_assoc($result)){//每循環(huán)一次游標(biāo)就前進(jìn)一次,游標(biāo)走到尾的時(shí)候,就不返回值了
  $row[]=$f; 
}
var_dump($row);

mongoDB代碼(js)

// while循環(huán)
var cursor = db.goods.find({goods_id:{$lte:20}},{_id:0,goods_id:1}); //使用變量來保存游標(biāo)
while(cursor.hasNext()){ //cursor.hasNext()判斷游標(biāo)是否取到盡頭
  printjson(cursor.next()); //cursor.next()取出游標(biāo)的下1個(gè)單元(從0開始游),注意print打印的是二進(jìn)制對象,printjson打印出來的才是可閱讀的json格式數(shù)據(jù)
}

// for循環(huán)
var cursor = db.goods.find({goods_id:{$lte:100}},{_id:0,goods_id:1}); //使用變量來保存游標(biāo)
for (;cursor.hasNext();) { //由于cursor.hasNext()自動(dòng)判斷的特性這里的for循環(huán)可以很簡單
  printjson(cursor.next());
}

//forEach循環(huán)
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);
游標(biāo)在分頁中的應(yīng)用 limit,skip,sort

比如查到10000行,跳過100頁,取10行.一般地,我們假設(shè)每頁N行, 當(dāng)前是page頁,就需要跳過前 (page-1)*N 行, 再取N行, 在mysql中, limit offset,N來實(shí)現(xiàn)

在mongo中,用skip(), limit()函數(shù)來實(shí)現(xiàn)的,當(dāng)獲得游標(biāo)后,我們可以先對游標(biāo)進(jìn)行處理后,再讓訪問數(shù)據(jù)庫的動(dòng)作按照我們的意愿發(fā)生。在這里我們就可以使用limit,skip,sort三個(gè)函數(shù)來處理游標(biāo)。同時(shí)這三個(gè)函數(shù)可以組成方法鏈?zhǔn)秸{(diào)用的形式。

limit:限制游標(biāo)返回的數(shù)量,指定了上限
skip:忽略前面的部分文檔,如果文檔總數(shù)量小于忽略的數(shù)量,則返回空集合
sort:得到的子集合進(jìn)行排序,可以按照多個(gè)鍵進(jìn)行正反排序!
# 查詢5條
> var cursor = db.goods.find({},{_id:0,goods_id:1}).limit(5); //注意,再次使用游標(biāo)的時(shí)候,游標(biāo)得重置,因?yàn)槭褂眠^一次就游到最后了;
> 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()
原因: 會把所有的行立即以對象形式組織在內(nèi)存里.可以在取出少數(shù)幾行時(shí),用此功能.
*/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/18809.html

相關(guān)文章

  • MongoDB指南---9、游標(biāo)與數(shù)據(jù)庫命令

    摘要:例如在中,可以用產(chǎn)生一個(gè)的隨機(jī)數(shù)這樣,想要從集合中查找一個(gè)隨機(jī)文檔,只要計(jì)算一個(gè)隨機(jī)數(shù)并將其作為查詢條件就好了,完全不用偶爾也會遇到產(chǎn)生的隨機(jī)數(shù)比集合中所有隨機(jī)值都大的情況,這時(shí)就沒有結(jié)果返回了。指定本次查詢中掃描文檔數(shù)量的上限。 上一篇文章:MongoDB指南---8、特定類型的查詢下一篇文章:MongoDB指南---10、索引、復(fù)合索引 簡介 數(shù)據(jù)庫使用游標(biāo)返回find的執(zhí)行結(jié)果...

    sutaking 評論0 收藏0
  • MongoDB指南---9、游標(biāo)與數(shù)據(jù)庫命令

    摘要:例如在中,可以用產(chǎn)生一個(gè)的隨機(jī)數(shù)這樣,想要從集合中查找一個(gè)隨機(jī)文檔,只要計(jì)算一個(gè)隨機(jī)數(shù)并將其作為查詢條件就好了,完全不用偶爾也會遇到產(chǎn)生的隨機(jī)數(shù)比集合中所有隨機(jī)值都大的情況,這時(shí)就沒有結(jié)果返回了。指定本次查詢中掃描文檔數(shù)量的上限。 上一篇文章:MongoDB指南---8、特定類型的查詢下一篇文章:MongoDB指南---10、索引、復(fù)合索引 簡介 數(shù)據(jù)庫使用游標(biāo)返回find的執(zhí)行結(jié)果...

    lemanli 評論0 收藏0
  • MongoDB指南---14、特殊的索引和集合:固定集合、TTL索引、全文本索引

    摘要:固定集合不能被分片。為固定集合指定文檔數(shù)量限制時(shí),必須同時(shí)指定固定集合的大小。沒有索引的集合默認(rèn)情況下,每個(gè)集合都有一個(gè)索引。 上一篇文章:MongoDB指南---13、索引類型、索引管理下一篇文章:MongoDB指南---15、特殊的索引和集合:地理空間索引、使用GridFS存儲文件 本章介紹MongoDB中一些特殊的集合和索引類型,包括: 用于類隊(duì)列數(shù)據(jù)的固定集合(capped...

    cikenerd 評論0 收藏0
  • MongoDB指南---14、特殊的索引和集合:固定集合、TTL索引、全文本索引

    摘要:固定集合不能被分片。為固定集合指定文檔數(shù)量限制時(shí),必須同時(shí)指定固定集合的大小。沒有索引的集合默認(rèn)情況下,每個(gè)集合都有一個(gè)索引。 上一篇文章:MongoDB指南---13、索引類型、索引管理下一篇文章:MongoDB指南---15、特殊的索引和集合:地理空間索引、使用GridFS存儲文件 本章介紹MongoDB中一些特殊的集合和索引類型,包括: 用于類隊(duì)列數(shù)據(jù)的固定集合(capped...

    QLQ 評論0 收藏0
  • pymong 游標(biāo)超時(shí):pymongo.errors.CursorNotFound: Cursor

    摘要:前言從庫批量抽取數(shù)據(jù)或數(shù)據(jù)集較大后續(xù)代碼運(yùn)行時(shí)間太長而導(dǎo)致游標(biāo)超時(shí)運(yùn)行解決方案設(shè)置連接永遠(yuǎn)不超時(shí)設(shè)置連接永遠(yuǎn)不超時(shí)一些業(yè)務(wù)邏輯手動(dòng)關(guān)閉連接,釋放資源 前言 從庫批量抽取數(shù)據(jù)或數(shù)據(jù)集較大后續(xù)代碼運(yùn)行時(shí)間太長而導(dǎo)致游標(biāo)超時(shí) 運(yùn)行env: python2.7 pymongo==3.7.0 mongodb:v3.6.6 解決方案:設(shè)置連接永遠(yuǎn)不超時(shí) client=pymongo.Mo...

    jsyzchen 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<