最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MongoDB查詢與游標(biāo)之分布式文件存儲

 更新時間:2023年04月03日 10:33:25   作者:哪吒  
這篇文章主要介紹了MongoDB的查詢與游標(biāo),查詢就是返回集合中文檔的一個子集,子集的范圍從0個文檔到整個集合;游標(biāo)的客戶端實現(xiàn)通常能夠在很大程度上對查詢的最終輸出進(jìn)行控制;感興趣的同學(xué)可以參考閱讀

一、查詢

1、find()基本用法

查詢就是返回集合中文檔的一個子集,子集的范圍從0個文檔到整個集合。要返回哪些文檔由find的第一個參數(shù)決定,該參數(shù)是一個用于指定查詢條件的文檔。

如果是空,則返回全部文檔。

當(dāng)向查詢文檔中添加鍵值對時,就意味著限定了查詢條件。例如db.users.find({"name":"哪吒編程"})

可以在查詢文檔時,傳入多個鍵值對,相當(dāng)于關(guān)系型數(shù)據(jù)庫中的where ... and ...。

2、指定要返回的鍵

有時候,只想查詢文檔中的部分鍵

> db.users.find({},{"id":1,"dept":1})
{ "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
{ "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }


> db.users.find({},{"_id":0,"dept":1})
{ "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
{ "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }

3、查詢條件

$lt、$lte、$gt、$gte都屬于比較運(yùn)算符,分別對應(yīng)<、<=、>、>=。

可以將其組合使用以查找一個范圍內(nèi)的值。

> db.users.find({"dept.age":{"$gte":20,"$lte":30}})

4、or查詢

MongoDB中有兩種方式可以進(jìn)行or查詢。$in可以用來查詢一個鍵的多個值。$or則更通用一些,可以在多個鍵中查詢?nèi)我獾慕o定值。

> db.users.find({"id":{"$in":["1","3"]}})
{ "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
{ "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
{ "_id" : ObjectId("638b4cacbb535f1c23f9b09c"), "id" : "3", "dept" : [ { "name" : "哪吒編程", "age" : 18, "address" : "大連" }, { "name" : "云韻", "age" : 19, "address" : "大連" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }
>

5、$not

$not是一個元條件運(yùn)算符,可以用于任何其它條件之上。

二、特定類型的查詢

1、null

null的行為有一些特別。它可以與自身匹配。

> db.users.find({"dept":null})
{ "_id" : ObjectId("638b538682bdbdfa72665a11"), "id" : "1", "dept" : null }

2、正則表達(dá)式

"$regex"可以在查詢中為字符串的模式匹配提供正則表達(dá)式功能。正則表達(dá)式對于靈活的字符串匹配非常有用。

> db.users.find({"name":{"$regex":"哪吒"}}))
{ "_id" : ObjectId("638b549982bdbdfa72665a12"), "id" : "1", "name" : "哪吒編程", "age" : 18 }
{ "_id" : ObjectId("638b54cd82bdbdfa72665a15"), "id" : "1", "name" : "CSDN哪吒", "age" : 18 }

MongoDB會使用Perl兼容的正則表達(dá)式(PRCE)庫來對正則表達(dá)式進(jìn)行匹配。任何PCRE支持的正則表達(dá)式語法都能被MongoDB接受。

3、查詢數(shù)組

$all可以通過多個元素匹配數(shù)組。

> db.workers.find({name:{$all:["哪吒編程","云韻"]}})
{ "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒編程", "云韻" ] }
{ "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒編程", "云韻", "美杜莎" ] }
{ "_id" : ObjectId("638b59fc82bdbdfa72665a17"), "id" : "2", "name" : [ "哪吒編程", "云韻", "納蘭嫣然" ] }

如果想在數(shù)組中查詢特定位置的元素,可以使用key.index語法來指定下標(biāo):

> db.workers.find({"name.2":"美杜莎"})
{ "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒編程", "云韻", "美杜莎" ] }

通過$size指定要查找的數(shù)組的大?。?/p>

> db.workers.find({"name":{"$size":2}})
{ "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒編程", "云韻" ] }

4、數(shù)組與范圍查找的相互作用

先舉一個例子:

> db.student.find()
{ "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒編程", "age" : 18 }
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }
{ "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "蕭炎", "age" : 38 }
> db.student.find({"age":{"$gt":20,"$lt":28}})
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }

和想象中的不太一樣啊,我的本意是查詢年齡在20~28之間的人,為什么呢?

文檔中的標(biāo)量(非數(shù)組元素)必須與查詢條件中的每一條子句相匹配。如果使用db.student.find({"age":{"$gt":20,"$lt":28}})進(jìn)行查詢,那么age必須介于20~28之間,然而,如果age是一個數(shù)組,那么當(dāng)age鍵中的某一個元素與查詢條件的任意一條語句相匹配時,文檔也會被返回。(即15<28,29大于20),完美適配。

這樣就會使針對數(shù)組的范圍查詢失去了作用。

此時,可以使用"$elemMatch"強(qiáng)制MongoDB將這兩個子句與單個數(shù)組元素進(jìn)行比較。不過,"$elemMatch"不會匹配非數(shù)組元素。

-- 返回空
db.student.find({"age":{"$elemMatch":{"$gt":20,"$lt":28}}})

如果在查詢的字段上有索引,那么可以使用min和max將查詢條件遍歷的索引范圍限制為"$gt""$lt"的值。

db.student.find({"age":{"$gt":20,"$lt":28}}).min({"age":20}).max({"age":28})

現(xiàn)在,這條查詢語句只會遍歷值在20~28之間的索引。

三、游標(biāo)

數(shù)據(jù)庫會使用游標(biāo)返回find的執(zhí)行結(jié)果。游標(biāo)的客戶端實現(xiàn)通常能夠在很大程度上對查詢的最終輸出進(jìn)行控制。你可以限制結(jié)果的數(shù)量,跳過一些結(jié)果,按任意方向的任意鍵組合對結(jié)果進(jìn)行排序,以及執(zhí)行徐國其他功能強(qiáng)大的操作。

通過cursor.hasNext()檢查是否還有其它結(jié)果,通過cursor.next()用來對其進(jìn)行獲取。

調(diào)用find()時,shell并不會立即查詢數(shù)據(jù)庫,而是等到真正開始請求結(jié)果時才發(fā)送查詢,這樣可以在執(zhí)行之前給查詢附加額外的選項。cursor對象的大多數(shù)方法會返回游標(biāo)本身,這樣就可以按照任意順序?qū)⑦x項鏈接起來了。

在使用db.users.find();查詢時,實際上查詢并沒有真正執(zhí)行,只是在構(gòu)造查詢,執(zhí)行cursor.hasNext(),查詢才會發(fā)往服務(wù)器端。shell會立刻獲取前100個結(jié)果或者前4MB的數(shù)據(jù)(兩者之中的較小者),這樣下次調(diào)用next或者h(yuǎn)asNext時就不必再次連接服務(wù)器去獲取結(jié)果了。在客戶端遍歷完第一組結(jié)果后,shell會再次連接數(shù)據(jù)庫,使用getMore請求更多的結(jié)果。getMore請求包含一個游標(biāo)的標(biāo)識符,它會向數(shù)據(jù)庫詢問是否還有更多的結(jié)果,如果有則返回下一批結(jié)果。這個過程會一直持續(xù),直到游標(biāo)耗盡或者結(jié)果被全部返回。

四、游標(biāo)的生命周期

在服務(wù)器端,游標(biāo)會占用內(nèi)存和資源。一旦游標(biāo)遍歷完結(jié)果之后,或者客戶端發(fā)送一條消息要求終止,數(shù)據(jù)庫就可以釋放它正在使用的資源。

何時銷毀游標(biāo):

  1. 當(dāng)游標(biāo)遍歷完匹配的結(jié)果時,它會消除自身;
  2. 當(dāng)游標(biāo)超出客戶端的作用域時,驅(qū)動程序會向數(shù)據(jù)庫發(fā)送一條特殊的消息,讓數(shù)據(jù)庫終止該游標(biāo);
  3. 如果10分鐘沒有被使用的話,數(shù)據(jù)庫游標(biāo)也將自動銷毀;

五、limit、skip、soat

1、常用的查詢選項

最常用的查詢選項是限制返回結(jié)果的數(shù)量、略過一定數(shù)量的結(jié)果以及排序。所有這些選項必須在查詢被發(fā)送到數(shù)據(jù)庫之前指定。

  • limit:限制數(shù)量;
  • skip:略過;
  • soat:排序,1是升序,-1是降序;

使用skip略過少量的文檔是可以的,但對于結(jié)果非常多的情況,skip會非常慢,因為要首先找到被略過的結(jié)果,然后再丟棄這些數(shù)據(jù)。

2、使用skip進(jìn)行分頁

最簡單的分頁方式是

> db.student.find().sort({"id":1}).limit(5)
{ "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒編程", "age" : 18 }
{ "_id" : ObjectId("638c6685e96330d24f819176"), "id" : "1", "name" : "哪吒編程", "age" : 18 }
{ "_id" : ObjectId("638c6685e96330d24f81917f"), "id" : "10", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638c6685e96330d24f819180"), "id" : "11", "name" : "美杜莎", "age" : 29 }
{ "_id" : ObjectId("638c6686e96330d24f819181"), "id" : "12", "name" : "蕭炎", "age" : 38 }
> db.student.find().sort({"id":1}).skip(5).limit(5)
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638c6685e96330d24f819177"), "id" : "2", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "蕭炎", "age" : 38 }
{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }
{ "_id" : ObjectId("638c6685e96330d24f819178"), "id" : "3", "name" : "美杜莎", "age" : 29 }
> db.student.find().sort({"id":1}).skip(10).limit(5)
{ "_id" : ObjectId("638c6685e96330d24f819179"), "id" : "4", "name" : "蕭炎", "age" : 38 }
{ "_id" : ObjectId("638c6685e96330d24f81917a"), "id" : "5", "name" : "哪吒編程", "age" : 18 }
{ "_id" : ObjectId("638c6685e96330d24f81917b"), "id" : "6", "name" : "云韻", "age" : 23 }
{ "_id" : ObjectId("638c6685e96330d24f81917c"), "id" : "7", "name" : "美杜莎", "age" : 29 }
{ "_id" : ObjectId("638c6685e96330d24f81917d"), "id" : "8", "name" : "蕭炎", "age" : 38 }
>

3、不用skip進(jìn)行分頁

可以通過以下方式:

 到此這篇關(guān)于MongoDB查詢與游標(biāo)之徹底玩轉(zhuǎn)分布式文件存儲的文章就介紹到這了,更多相關(guān)MongoDB查詢與游標(biāo)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MongoDB 3.6.5常見的安裝失敗原因和解決辦法

    MongoDB 3.6.5常見的安裝失敗原因和解決辦法

    在開發(fā)過程中,可能會用到 MongoDB 數(shù)據(jù)庫,在進(jìn)行MongoDB的安裝過程中,可能會遇到各種各樣的問題導(dǎo)致安裝失敗,本文將針對常見的安裝失敗情況(,例如端口占用、系統(tǒng)文件問題和版本兼容問題等)進(jìn)行分析,并提供解決方案和相應(yīng)的代碼示例
    2024-03-03
  • MongoDB中的定時索引示例詳解

    MongoDB中的定時索引示例詳解

    這篇文章主要給大家介紹了關(guān)于MongoDB中定時索引的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python實現(xiàn)爬蟲數(shù)據(jù)存到 MongoDB

    python實現(xiàn)爬蟲數(shù)據(jù)存到 MongoDB

    本文給大家分享的是使用python實現(xiàn)將爬蟲爬到的數(shù)據(jù)存儲到mongoDB數(shù)據(jù)庫中的實例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • 阿里云服務(wù)器安裝mongodb的方法

    阿里云服務(wù)器安裝mongodb的方法

    這篇文章主要介紹了阿里云服務(wù)器安裝mongodb的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • mongodb使用心得簡單總結(jié)

    mongodb使用心得簡單總結(jié)

    本文整理了一年多以來我常用的MongoDB操作,既有運(yùn)維層面也有應(yīng)用層面,內(nèi)容有淺有深,這也就是我從零到熟練的歷程。
    2016-01-01
  • mongoDB4.0數(shù)據(jù)庫的操作方法

    mongoDB4.0數(shù)據(jù)庫的操作方法

    這篇文章主要介紹了mongoDB4.0數(shù)據(jù)庫的操作方法及注意事項,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • MongoDB副本集丟失數(shù)據(jù)的測試實例教程

    MongoDB副本集丟失數(shù)據(jù)的測試實例教程

    這篇文章主要給大家介紹了關(guān)于MongoDB副本集丟失數(shù)據(jù)的測試的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 關(guān)于MongoDB索引管理-索引的創(chuàng)建、查看、刪除操作詳解

    關(guān)于MongoDB索引管理-索引的創(chuàng)建、查看、刪除操作詳解

    本文講述了關(guān)于MongoDB索引管理包括索引的創(chuàng)建、查看索引、刪除索引各方面的命令及使用方法
    2018-03-03
  • MongoDB常用數(shù)據(jù)庫命令大全

    MongoDB常用數(shù)據(jù)庫命令大全

    這篇文章主要介紹了MongoDB 常用數(shù)據(jù)庫命令大全,需要的朋友可以參考下
    2020-02-02
  • MongoDB搭建高可用集群的完整步驟(3個分片+3個副本)

    MongoDB搭建高可用集群的完整步驟(3個分片+3個副本)

    這篇文章主要給大家介紹了關(guān)于MongoDB搭建高可用集群(3個分片+3個副本)的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

连城县| 襄樊市| 环江| 新营市| 湘潭市| 密云县| 牡丹江市| 冀州市| 苏州市| 齐河县| 永昌县| 平阴县| 德昌县| 淮阳县| 连云港市| 浦县| 永靖县| 集安市| 吴堡县| 兴海县| 桐梓县| 清远市| 辽阳县| 郯城县| 察雅县| 科技| 舟曲县| 西城区| 八宿县| 罗田县| 平山县| 瑞丽市| 扶沟县| 海城市| 积石山| 那曲县| 东平县| 文水县| 横峰县| 罗江县| 外汇|