青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長網

17站長網 首頁 數據庫 MongoDB 查看內容

mongodb游標的作用是什么?怎樣使用?

2023-3-21 16:03| 查看: 2020 |來源: 互聯網

游標相當于C語言的指針,可以定位到某條記錄,在MongoDB中,則是文檔。因此在mongoDB中游標也有定義,聲明, 打開,讀取,關閉這么個過程。客戶端通過游標,能夠 ...

游標相當于C語言的指針,可以定位到某條記錄,在MongoDB中,則是文檔。因此在mongoDB中游標也有定義,聲明, 打開,讀取,關閉這么個過程。客戶端通過游標,能夠實現對最終結果進行有效的控制,諸如限制結果數量,跳過部分結果或根據任意鍵按任意順序的組合對結果進行各種排序等。

       一、mongoDB游標介紹

  db.collection.find()方法返回一個游標,對于文檔的訪問,我們需要進行游標迭代

  mongoDB的游標與關系型數據庫SQL中的游標類似,可以通過對游標進行(如限制查詢結果數,跳過的結果數等)設置來控制查詢結果

  游標會消耗內存和相關系統資源,游標使用完后應盡快釋放資源

  在mongo shell中,如果返回的游標結果集未指定給某個var定義的變量,則,游標自動迭代20次,即輸出前20個文檔,超出20的情形則需要輸入it來翻頁

  本文內容描述手動方式來實現游標迭代來訪問文檔或者是用索引迭代

  聲明游標

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

  打開游標

      Cursor.hasNext() 判斷游標是否已經取到盡頭

  讀取數據

      Cursor.Next()  取出游標的下一個文檔

  關閉游標

      cursor.close()  此步驟可省略,通常為自動關閉,也可以顯示關閉

  用while循環來遍歷游標示例

      var mycursor = db.bar.find({_id:{$lte:5}})

      while(mycursor.hasNext()) {

          printjson(mycursor.next());

          }

  游標生命周期

      a、游標完成匹配結果的迭代后,它會清除自身;

      b、客戶端的游標已經不在作用域內,驅動程序回向服務器發送一條特別的消息,讓其銷毀;

      c、缺省情況下,游標在十分鐘內沒有使用,游標自動關閉或者客戶端已經迭代完整個游標;

      d、可以通過cursor.noCursorTimeout()來定義游標超時時間

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

      e、對于自定義超時時長的游標可以使用cursor.close() 來關閉游標

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

       二、當前環境及數據準備

 repSetTest:PRIMARY> db.version()

  3.0.12

  //創建包含29個文檔的集合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  //上面的結果只輸出了20行,這個提示表明查看更多應輸入it

  repSetTest:PRIMARY> it

  { "_id" : ObjectId("5804d07fd974b32430ea975c"), "id" : 21, "ename" : "usr21" }

   ..............

  { "_id" : ObjectId("5804d07fd974b32430ea9764"), "id" : 29, "ename" : "usr29" }

       三、使用print輸出游標結果集

 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"

  }

  //上述查詢中通過var myCursor進行變量的定義,相當于SQL中的declare cursor cur_name is select ..

  //變量 myCursor定義僅僅是定義,并不會訪問數據庫,而是在myCursor.hasNext()真正訪問數據庫

  //myCursor.next()則是輸出下一條記錄,hasNext()訪問數據庫時會根據缺省游標設定將結果讀取到本地

       四、使用printjsont輸出游標結果集

  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()進行迭代

  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"

  }

       六、基于數組索引迭代

       可以使用toArray()將游標迭代文檔返回到一個數組,然后通過數組下標方式進行訪問。

       該方法將所有由游標返回的文檔裝載進內存。

 //如下示例,將游標返回的內容傳遞到數組,然后使用 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

  }

  //也可以將數組元素輸出到某個變量,然后在用printjson(myDocument)輸出這個變量,如下

  repSetTest:PRIMARY> var myDocument = documentArray[3];

  repSetTest:PRIMARY> printjson(myDocument)

  {

      "_id" : ObjectId("580d775edeb57e4d05eec0f2"),

      "id" : 24,

      "ename" : "usr24"

  }

       七、調整游標迭代次數

 //設置迭代顯示的次數,如下設置為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 //從上面的查詢結果可知,當輸出5個文檔就提示需要輸入it來查看更多

  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

       八、查看游標度量信息

 可以通過db.serverStatus()查看游標狀態相關的信息,這些信息通常包括

      從服務器上次啟動之后游標超時的數量

      自定義游標超時的數量

      游標打開后已經pinned的數量

      打開游標的總數目

  //如下查詢本機游標的信息    

  repSetTest:PRIMARY> db.serverStatus().metrics.cursor

  {

      "timedOut" : NumberLong(2),

      "open" : {

          "noTimeout" : NumberLong(0),

          "pinned" : NumberLong(0),

          "total" : NumberLong(2)

      }

  } 

本文最后更新于 2023-3-21 16:03,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:[email protected]
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!

掃一掃,關注站長網微信

大家都在看

熱門排行

最近更新

返回頂部
主站蜘蛛池模板: 最近中文字幕MV免费高清视频8 | 日本久久网站 | 日韩亚洲欧美中文高清在线 | 欧美黑大炮18p | 日产2021免费一二三四区在线 | 美女脱了内裤张开腿让男人爽 | 最近中文字幕高清中文字幕MV | 国产在线观看网址你懂得 | 内射人妻骚骚骚 | 精品日韩视频 | 久久精品国产亚洲AV未满十八 | 在线精品视频成人网 | 午夜特级毛片 | 在野外被男人躁了一夜动图 | 乳巨揉みま痴汉电车中文字幕动漫 | 久久精品国产在热亚洲 | 国产精品自产拍在线观看中文 | 狠很橹快播| 蜜臀AV浪潮99国产麻豆 | 免费国产成人高清在线看软件 | 在线观看免费精品国产 | 国产精品久久久久婷婷五月色 | 亚洲中文字幕AV在天堂 | 俄罗斯XBXBXB兽交 | 亚洲国产综合人成综合网站00 | 国产人妻精品无码AV在线五十路 | 中文字幕在线观看网址 | 久久视频在线视频 | 97超碰97资源在线观看 | 久久这里只有精品国产精品99 | 日韩一区二区三区射精 | 久久激情网 | 日本高清免费在线观看 | 日本熟妇乱妇熟色A片蜜桃 日本熟妇多毛XXXXX视频 | 中俄两军在日本海等上空战略巡航 | 语文老师扒开胸罩喂我奶 | 久久婷婷色一区二区三区 | 久久精品亚洲 | 久久99精品AV99果冻 | 最新国产三级在线不卡视频 | 亚洲AV色香蕉一区二区9255 |