麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 數(shù)據(jù)庫(kù) > MongoDB > 正文

MongoDB中游標(biāo)的深入學(xué)習(xí)

2020-10-29 18:47:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

MongoDB中的游標(biāo)與關(guān)系型數(shù)據(jù)庫(kù)中的游標(biāo)在功能上大同小異。游標(biāo)相當(dāng)于C語(yǔ)言的指針,可以定位到某條記錄,在MongoDB中,則是文檔。因此在mongoDB中游標(biāo)也有定義,聲明, 打開(kāi),讀取,關(guān)閉這么個(gè)過(guò)程??蛻舳送ㄟ^(guò)游標(biāo),能夠?qū)崿F(xiàn)對(duì)最終結(jié)果進(jìn)行有效的控制,諸如限制結(jié)果數(shù)量,跳過(guò)部分結(jié)果或根據(jù)任意鍵按任意順序的組合對(duì)結(jié)果進(jìn)行各種排序等。

通俗的說(shuō),游標(biāo)不是查詢結(jié)果,可以理解為數(shù)據(jù)在遍歷過(guò)程中的內(nèi)部指針,其返回的是一個(gè)資源,或者說(shuō)數(shù)據(jù)讀取接口.

客戶端通過(guò)對(duì)游標(biāo)進(jìn)行一些設(shè)置就能對(duì)查詢結(jié)果進(jìn)行有效地控制,如可以限制查詢得到的結(jié)果數(shù)量、跳過(guò)部分結(jié)果、或?qū)Y(jié)果集按任意鍵進(jìn)行排序等!

直接對(duì)一個(gè)集合調(diào)用find()方法時(shí),我們會(huì)發(fā)現(xiàn),如果查詢結(jié)果超過(guò)二十條,只會(huì)返回二十條的結(jié)果,這是因?yàn)镸ongodb會(huì)自動(dòng)遞歸find() 返回的游標(biāo)。

下文是針對(duì)MongoDB游標(biāo)的具體介紹。

一、mongoDB游標(biāo)介紹

db.collection.find()方法返回一個(gè)游標(biāo),對(duì)于文檔的訪問(wèn),我們需要進(jìn)行游標(biāo)迭代

mongoDB的游標(biāo)與關(guān)系型數(shù)據(jù)庫(kù)SQL中的游標(biāo)類似,可以通過(guò)對(duì)游標(biāo)進(jìn)行(如限制查詢結(jié)果數(shù),跳過(guò)的結(jié)果數(shù)等)設(shè)置來(lái)控制查詢結(jié)果

游標(biāo)會(huì)消耗內(nèi)存和相關(guān)系統(tǒng)資源,游標(biāo)使用完后應(yīng)盡快釋放資源

在mongo shell中,如果返回的游標(biāo)結(jié)果集未指定給某個(gè)var定義的變量,則,游標(biāo)自動(dòng)迭代20次,即輸出前20個(gè)文檔,超出20的情形則需要輸入it來(lái)翻頁(yè)

本文內(nèi)容描述手動(dòng)方式來(lái)實(shí)現(xiàn)游標(biāo)迭代來(lái)訪問(wèn)文檔或者是用索引迭代

    聲明游標(biāo)

           var cursor =  db.collectioName.find(query,projection);

    打開(kāi)游標(biāo)

            Cursor.hasNext() 判斷游標(biāo)是否已經(jīng)取到盡頭

    讀取數(shù)據(jù)

            Cursor.Next()    取出游標(biāo)的下一個(gè)文檔

    關(guān)閉游標(biāo)

            cursor.close()   此步驟可省略,通常為自動(dòng)關(guān)閉,也可以顯示關(guān)閉

用while循環(huán)來(lái)遍歷游標(biāo)示例

 var mycursor = db.bar.find({_id:{$lte:5}}) while(mycursor.hasNext()) {  printjson(mycursor.next());  }

    游標(biāo)生命周期

            a、游標(biāo)完成匹配結(jié)果的迭代后,它會(huì)清除自身;

            b、客戶端的游標(biāo)已經(jīng)不在作用域內(nèi),驅(qū)動(dòng)程序回向服務(wù)器發(fā)送一條特別的消息,讓其銷毀;

            c、缺省情況下,游標(biāo)在十分鐘內(nèi)沒(méi)有使用,游標(biāo)自動(dòng)關(guān)閉或者客戶端已經(jīng)迭代完整個(gè)游標(biāo);

            d、可以通過(guò)cursor.noCursorTimeout()來(lái)定義游標(biāo)超時(shí)時(shí)間

                    如:var myCursor = db.users.find().noCursorTimeout() 

           e、對(duì)于自定義超時(shí)時(shí)長(zhǎng)的游標(biāo)可以使用cursor.close() 來(lái)關(guān)閉游標(biāo)

                    如:db.collection.find(<query>).close()

二、當(dāng)前環(huán)境及數(shù)據(jù)準(zhǔn)備

 repSetTest:PRIMARY> db.version() 3.0.12 //創(chuàng)建包含29個(gè)文檔的集合user repSetTest:PRIMARY> for (var i=1;i<30;i++){ ... db.user.insert({"id":i,"ename":"usr"+i}); ... } WriteResult({ "nInserted" : 1 }) repSetTest:PRIMARY> db.user.count() 29 //查詢集合user上所有文檔 repSetTest:PRIMARY> db.user.find() { "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" } { "_id" : ObjectId("5804d07fd974b32430ea9749"), "id" : 2, "ename" : "usr2" } ............................. { "_id" : ObjectId("5804d07fd974b32430ea975b"), "id" : 20, "ename" : "usr20" } Type "it" for more //上面的結(jié)果只輸出了20行,這個(gè)提示表明查看更多應(yīng)輸入it repSetTest:PRIMARY> it { "_id" : ObjectId("5804d07fd974b32430ea975c"), "id" : 21, "ename" : "usr21" } .............. { "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" }

二、使用print輸出游標(biāo)結(jié)果集

 repSetTest:PRIMARY> var myCursor = db.user.find() while (myCursor.hasNext()) { print(tojson(myCursor.next())) } { "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" } .......... { "_id" : ObjectId("5804d07fd974b32430ea9751"), "id" : 10, "ename" : "usr10" } ................ { "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" } //上述查詢中通過(guò)var myCursor進(jìn)行變量的定義,相當(dāng)于SQL中的declare cursor cur_name is select .. //變量 myCursor定義僅僅是定義,并不會(huì)訪問(wèn)數(shù)據(jù)庫(kù),而是在myCursor.hasNext()真正訪問(wèn)數(shù)據(jù)庫(kù) //myCursor.next()則是輸出下一條記錄,hasNext()訪問(wèn)數(shù)據(jù)庫(kù)時(shí)會(huì)根據(jù)缺省游標(biāo)設(shè)定將結(jié)果讀取到本地

三、使用printjsont輸出游標(biāo)結(jié)果集

 repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}}) while (myCursor.hasNext()) { printjson(myCursor.next());} { "_id" : ObjectId("5804d07fd974b32430ea975c"), "id" : 21, "ename" : "usr21" } ....... { "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" }

四、使用 forEach()進(jìn)行迭代

 repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}}) repSetTest:PRIMARY> myCursor.forEach(printjson); { "_id" : ObjectId("5804d07fd974b32430ea975c"), "id" : 21, "ename" : "usr21" } ................ { "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" }

五、基于數(shù)組索引迭代

    可以使用toArray()將游標(biāo)迭代文檔返回到一個(gè)數(shù)組,然后通過(guò)數(shù)組下標(biāo)方式進(jìn)行訪問(wèn)。
    該方法將所有由游標(biāo)返回的文檔裝載進(jìn)內(nèi)存。

 //如下示例,將游標(biāo)返回的內(nèi)容傳遞到數(shù)組,然后使用 printjson (documentArray[3])輸出其中的元素 repSetTest:PRIMARY> var myCursor = db.user.find({id:{$gt:20}}) repSetTest:PRIMARY> var documentArray = myCursor.toArray(); repSetTest:PRIMARY> printjson (documentArray[3]) { "_id" : ObjectId("580d775edeb57e4d05eec0f2"), "id" : 24, //Author : Leshami "ename" : "usr24" //Blog : http://blog.csdn.net/leshami } //也可以將數(shù)組元素輸出到某個(gè)變量,然后在用printjson(myDocument)輸出這個(gè)變量,如下 repSetTest:PRIMARY> var myDocument = documentArray[3]; repSetTest:PRIMARY> printjson(myDocument) { "_id" : ObjectId("580d775edeb57e4d05eec0f2"), "id" : 24, "ename" : "usr24" }

六、調(diào)整游標(biāo)迭代次數(shù)

 //設(shè)置迭代顯示的次數(shù),如下設(shè)置為5 repSetTest:PRIMARY> DBQuery.shellBatchSize = 5 5 repSetTest:PRIMARY> db.user.find() { "_id" : ObjectId("5804d07fd974b32430ea9748"), "id" : 1, "ename" : "usr1" } { "_id" : ObjectId("5804d07fd974b32430ea9749"), "id" : 2, "ename" : "usr2" } { "_id" : ObjectId("5804d07fd974b32430ea974a"), "id" : 3, "ename" : "usr3" } { "_id" : ObjectId("5804d07fd974b32430ea974b"), "id" : 4, "ename" : "usr4" } { "_id" : ObjectId("5804d07fd974b32430ea974c"), "id" : 5, "ename" : "usr5" } Type "it" for more //從上面的查詢結(jié)果可知,當(dāng)輸出5個(gè)文檔就提示需要輸入it來(lái)查看更多 repSetTest:PRIMARY> it { "_id" : ObjectId("5804d07fd974b32430ea974d"), "id" : 6, "ename" : "usr6" } { "_id" : ObjectId("5804d07fd974b32430ea974e"), "id" : 7, "ename" : "usr7" } { "_id" : ObjectId("5804d07fd974b32430ea974f"), "id" : 8, "ename" : "usr8" } { "_id" : ObjectId("5804d07fd974b32430ea9750"), "id" : 9, "ename" : "usr9" } { "_id" : ObjectId("5804d07fd974b32430ea9751"), "id" : 10, "ename" : "usr10" } Type "it" for more

七、查看游標(biāo)度量信息

可以通過(guò)db.serverStatus()查看游標(biāo)狀態(tài)相關(guān)的信息,這些信息通常包括

從服務(wù)器上次啟動(dòng)之后游標(biāo)超時(shí)的數(shù)量

自定義游標(biāo)超時(shí)的數(shù)量

游標(biāo)打開(kāi)后已經(jīng)pinned的數(shù)量

打開(kāi)游標(biāo)的總數(shù)目

 //如下查詢本機(jī)游標(biāo)的信息  repSetTest:PRIMARY> db.serverStatus().metrics.cursor { "timedOut" : NumberLong(2), "open" : {  "noTimeout" : NumberLong(0),  "pinned" : NumberLong(0),  "total" : NumberLong(2) } }

總結(jié)

以上就是關(guān)于MongoDB游標(biāo)的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用MongoDB的時(shí)候能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产一区二区久久精品 | 爱操视频 | 成年免费大片黄在线观看岛国 | 久久精品黄 | 久久羞羞视频 | av日韩一区二区三区 | 久久精品视频69 | 激情视频在线播放 | 天天干导航| 亚洲影视在线观看 | 国产一有一级毛片视频 | 一区二区久久精品66国产精品 | 欧美性受xxx黑人xyx性爽 | av日韩在线免费观看 | 91九色国产视频 | 天天看夜夜爽 | 国产精品免费观看视频 | 香蕉久久久精品 | 亚洲精品一区二区三区免 | 暖暖免费观看高清完整版电影 | av电影免费在线看 | 色毛片 | 麻豆一二区 | 99国内精品 | 日韩视频不卡 | 日韩电影一区二区三区 | 国产亚洲综合一区二区 | 午夜看毛片 | 成人在线观看免费高清 | 18欧美性xxxx极品hd | 一级电影在线观看 | 国产在线精品区 | 免费一级肉体全黄毛片 | 欧美日韩精品中文字幕 | 久久久久久久久久综合 | 久色精品 | 一区国产精品 | 成人在线免费视频观看 | 午夜精品久久久久久久久久久久久蜜桃 | 精品国产一区二区亚洲人成毛片 | 黄色大片大毛片 |