這篇文章給大家介紹怎么進(jìn)行MongoDB 查詢,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的萬寧網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
慣了SQL 語句的開發(fā)人員,在使用MONGODB 的時候,很可能會誤會這個數(shù)據(jù)庫。 糾正三點(diǎn)
1 MONGODB 雖然是存儲 JOSN 串,但不是你想怎樣存就可以怎樣存,雖然已經(jīng)比傳統(tǒng)數(shù)據(jù)庫在處理數(shù)據(jù)的SCHEMA 上開放的多,但如果你真的開打發(fā)了,那MONGODB 數(shù)據(jù)庫的歸屬性質(zhì),也的把你打回原形。
2 MONGODB 的查詢語句雖然不如傳統(tǒng)SQL語句,可以進(jìn)行那么多的判斷(剛剛更新,MONGO語句可以有IF THEN 在查詢語句中,逆天了),轉(zhuǎn)換,但數(shù)據(jù)庫的本性使然,撰寫MONGODB 的查詢語句,也是要有點(diǎn)技巧,否則查詢中可以讓你等到天昏地暗,這不怪MONGODB ,這就要怪你不懂她的原理和秉性。
3 MONGODB 的使用也是有規(guī)范的,不是程序員想怎樣就怎樣,世間任何東西都有他的規(guī)律和屬性,所以使用MONGO DB 自然也是要有規(guī)范的。
以下就從上面三個方面來讓不清楚如何使用的MONGODB 的親們,來熟悉一下。
ONE , MONGODB 沒有數(shù)據(jù)庫SCHEMA,每個collection 的document 我想怎么存就怎么存,上一個docuemnt 我可以存我的某個貸款的記錄,下一個Document 我就可以存 還款的違約記錄。
如果你問我,可以這樣做嗎,從MONGODB 的原理上,你可以,你當(dāng)然可以,可我想問,MONGODB 的數(shù)據(jù)庫屬性,你是不是忘記了,她不是記事本,她是一個要供你插入可能比傳統(tǒng)數(shù)據(jù)庫多幾十倍的數(shù)據(jù),并且最終你要從這幾千萬,幾十億條的數(shù)據(jù)量里面過濾出你要幾十條數(shù)據(jù),你覺得你上面如此,每個DOCUMENT 毫無聯(lián)系的存儲方法,對你的系統(tǒng)有何幫助,不如你就用文本文件吧,那個更適合你。
MONGODB 的COLLECTION (表),是有表的含義的,一個MONGODB的表(collection)雖然可以讓你的SCHEMA 沒有任何的規(guī)律,但你心里要有譜,這個collection 應(yīng)該有什么,他們這些由documentS 組成的 collection 對我未來的數(shù)據(jù)處理要起到什么樣的作用。
這里就的談?wù)?,為什么有MONGODB 這樣的數(shù)據(jù)庫了,還的說,大數(shù)據(jù)量和微服務(wù),以及敏捷開發(fā)。 試想如果你有一個項(xiàng)目,你不知道他有多少個字段,未來一年內(nèi)要有多少字段的添加,和刪減,并且你不知道這些字段命名,而且馬上就要開始在目前的狀態(tài)下,調(diào)試你的項(xiàng)目,并上線,你感覺如何, F打頭的英文單詞是不是想馬上脫口而出。
STOP,MONGODB 可以幫助你快速的響應(yīng)和處理這樣的項(xiàng)目,但這不意味著MONGO DB 是這樣項(xiàng)目的 垃圾場和背鍋俠。 就是這樣無厘頭的項(xiàng)目和不能確定的表設(shè)計,讓MONGODB 凸顯而出。 (什么,沒有這樣的項(xiàng)目,你確定?)
另外微服務(wù)中的信息匯聚,如果你有這樣一套MONGODB 幫助你將微服務(wù)中的多個組件的信息交流,集中化,透明化,這也不失為另一種使用的另辟蹊徑,因?yàn)槲⒎?wù)中,信息傳遞和信息丟失,已經(jīng)讓你感到不爽,而MONGODB,算是一個你的管家,將這些信息都保存后,方便你用MONGODB 的語句進(jìn)行查詢,而不是在文件日志中,查來查去,并且速度那是相當(dāng)快,us納秒的速度,億萬級的數(shù)據(jù)量,當(dāng)然這一切是集中在你能理解她的結(jié)構(gòu)和使用方式,甚至你已經(jīng)可以將MONGODB 作為BI 的基礎(chǔ)數(shù)據(jù)庫,將及亂又復(fù)雜的信息,通過套件的方式輸出。(MONGO 支持BI自有套件)
如果英語是世界的通行的語句,JOSN 就是計算機(jī)程序中,消息傳遞的世界通用語句,各種消息可以通過通用的JOSN 格式,將你的數(shù)據(jù)從一個微服務(wù)的世界,傳遞到另一個世界,而不用在去理會是 WINDOWS系統(tǒng),還是LINUX 系統(tǒng),是JAVA 還是 .NET CORE 或者 PYTHON, GO 之類的,因?yàn)槟阒灰螶OSN 的格式存儲的數(shù)據(jù),計算機(jī)界的處理方式都可以,因?yàn)樗鞘澜缯Z。
而MONGO DB 具有強(qiáng)大的 處理JOSN 格式數(shù)據(jù)的能力,你可以利用各種MONGO DB 的語法,將JOSN 層層嵌套和數(shù)組都扒個精光,將你要的呈現(xiàn)在你的眼前。
STOP , 又扯遠(yuǎn)了。
下面的說說使用 MONGO DB 的語句如何查詢出你要的信息,并且通過索引的方式來進(jìn)行。 所以下面要談兩個問題, 1 查詢的方式 2 索引的建立技巧(MONGODB 的查詢也是博大精深,索引更是豐富多彩,能力有限,能講多少就多少)
1 查詢數(shù)據(jù)中,請注意,沒有事務(wù)性,也就是沒有多表關(guān)聯(lián)這樣的事情出現(xiàn)在MONGODB 中,你的注意力,只需要定位到你要查的 一張表上。
注:MONGODB 更新很快,有些在網(wǎng)上查到的語句,已經(jīng)過時或不在能使用,對應(yīng)的語句請查看你對應(yīng)的版本。以下語句,均已 MONGODB 3.6 作為標(biāo)準(zhǔn)。
舉個簡單的例子,我們下面又一個 collection 下面有如下數(shù)據(jù) 2700百萬(數(shù)據(jù)量比較少,湊后吧)
我們想通過filesource 和 filetype 兩個屬性,來查找匹配的數(shù)據(jù),那我們有以下的一條查詢語句可以做這件事。
db.dbmongolog2.find({"filesource":0,"filetype":"1"})
通過上面這條語句,數(shù)據(jù)很快就查出來了,(畫外音:這么簡單),當(dāng)然不是,難度的一點(diǎn)點(diǎn)的來,飯的一口口的吃。
那么問題來了,我們查詢MONGO DB 中的數(shù)據(jù),如果僅僅只需要顯示部分?jǐn)?shù)據(jù),而不需要全部將所有的數(shù)據(jù)顯示,是否可以節(jié)省查詢的時間。
YES 是的,和傳統(tǒng)數(shù)據(jù)庫的查詢一樣,你要展示那些數(shù)據(jù)就標(biāo)識出,你要看那些,你不看的,一定不要讓他SHOW出來。
這就是 MONGODB 查詢規(guī)則 1
用那個字段,就顯示那個字段,不用的別展示。 具體語句怎么寫
db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0})
db.dbmongolog2.find({"filesource":0,"filetype":"1"})
那這樣寫的語句,在執(zhí)行效率上有什么差別,這里做了比較,效率提高10%,由原來的0.020 秒,變?yōu)?.018秒,當(dāng)然如果數(shù)據(jù)量再大,過濾的字段的大小在大,則速度會更快,這點(diǎn)可以說和傳統(tǒng)數(shù)據(jù)庫沒有差別。
所以開發(fā)的DEVELOPER們,使用MONGODB ,一樣不要把你不要的字段SHOW 出來,要禁止他。語法就是在后面加 {} 然后將字段名字后面 冒號加0 。
當(dāng)然開發(fā)說,你這個不科學(xué),MONGODB 每個DOCUEMNT (行),都不一樣的情況下,我這樣怎么干。
好干:那就只顯示你要的字段不就完了
db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":1})
、
你只需要,將標(biāo)識0的地方,標(biāo)識為 1 即可,另外從截圖也看出了,執(zhí)行的時間,已經(jīng)到了 0.08秒,快了 百分之60%。 所以這個規(guī)矩,你們是要知道的。
那我們繼續(xù),加大難度,現(xiàn)在我們認(rèn)為,查詢的時間還是過長,你(我一直宣稱MONGODB 的查詢速度可以達(dá)到 納秒),那我們就來看看,MONGODB 查詢繼續(xù)加速。
索引,MONGODB 和傳統(tǒng)數(shù)據(jù)庫一樣,是有索引的,而且索引的種類更多。
針對上面的查詢,我們怎么來搞一下。
1 其實(shí)我們還是要知
db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0})
這個語句其實(shí)是在走全表掃描,這樣是不OK 的,我們需要建立索引
(當(dāng)然在建立索引前我們是應(yīng)該,進(jìn)行分析,索引建立的是否能更有效,索引建立的值得不值得,今天時間比較緊,暫不討論,當(dāng)然我們一般還是要建立采樣率的分析),其實(shí)這個采樣率來看,添加索引并不理想。但這里我們僅僅是演示,來建立一個索引。
db.dbmongolog2.createIndex({filesource:1,filetype:1},{name:"idx_dbmongolog2_filesource_filetype",background:true})
可以通過執(zhí)行計劃來驗(yàn)證,當(dāng)前的查詢已經(jīng)可以走剛剛建立的索引了
但是別高興的太早,如果把查詢語句改寫為
db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0}).sort({_id:1})
馬上在看執(zhí)行計劃,已經(jīng)不再走剛建好的索引了,走了OBJECT_ID 主鍵,當(dāng)然執(zhí)行的效率比全表掃描的效率還差。 這里我們到底做了什么,讓MONGODB 不再走我們剛剛建立好的索引,答案就是 sort({_id:1})
所以一般查詢語句,如果不需要排序,就不要使用排序,否則很可能你剛剛辛苦建立好的索引,就不在生效了。但如果必須要進(jìn)行排序怎么辦。
在重新建立了索引后,我們的查詢速度又和飛一樣了,看下圖
db.dbmongolog2.createIndex({filesource:1,filetype:1,_id:-1},{name:"idx_dbmongolog2_filesource_filetype_id",background:true})
上面的建立索引的語句,請注意每個字段的后面的數(shù)字, 1是升序,-1是降序,尤其排序,如果經(jīng)常降序,則就別把索引建立成升序。
講完簡單的查詢和索引的建立,其實(shí)一個MONGODB 數(shù)據(jù)庫的系統(tǒng)能順暢建立,主要還要考慮你的collection,當(dāng)然如果你僅僅將MONGODB 作為日志的系統(tǒng),你可以考慮的更少。
但實(shí)際上,MONGODB 的collection 的確是可以做很多事,例如他可以輕松將傳統(tǒng)數(shù)據(jù)庫上的幾個負(fù)載的 JOIN 操作,在一個collection就完成了,通過嵌套,將這些JOIN 就體現(xiàn)在一個 collection上,所以查詢的速度會很快,是傳統(tǒng)數(shù)據(jù)庫望塵莫及的。缺點(diǎn)嗎, 可能會損失空間,是一種用空間,換時間的方式。(MONGODB 的數(shù)據(jù)會自動壓縮,進(jìn)入就壓縮,所以非要找點(diǎn)缺點(diǎn),也的說點(diǎn))。
下面在對表的查詢和索引,在進(jìn)一步,既然是晉級,
1 索引的建立技巧,我們繼續(xù)看下面的查詢語句,我們查詢一個時間在2018年12月18日后的記錄,并且filetype字段,是
db.dbmongolog2.find({"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")},"filetype":1}
很明顯查詢已經(jīng)走了全表掃描,不是建立了索引,為什么不可以了,我們換一種寫法
db.dbmongolog2.find({"filetype":1,"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")}},{"_id":1}).explain()
換一種寫法,查看執(zhí)行計劃,還是不可以,還是全表掃描
這里總結(jié)一個MONGODB 的建立索引的規(guī)律
索引建立有技巧,可以先算采樣率,分布離散字段放前邊,符合字段索引,必查字段放前邊,一個查詢可以多個字段,多個索引,可以使用索引的交集(MySQL中的INDEX MERGE的概念有點(diǎn)像),如何使用還要看優(yōu)化引擎的選擇。但如果一個復(fù)合索引能解決的,最好不要使用
所以一個MONGODB 看上去就是一個文檔數(shù)據(jù)庫,整體執(zhí)行文件才百兆,但里面的東西,不比 ORACLE SQL SERVER 的知識少,也夠喝一壺。
另外小小的MONGODB ,也可以做聚合,類似傳統(tǒng)數(shù)據(jù)庫的 GROUP BY HAVING SUM ,AVAGE 等運(yùn)算,所以這個MONGODB 絕非善類,4.0開始支持事務(wù),所以NO-SQL 數(shù)據(jù)庫,哪天發(fā)力也不光搶光非關(guān)系的市場,連你關(guān)系型的市場,也要分一杯羹。
MONGODB的聚合操作
db.dbmongolog2.aggregate([{"$match":{"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")}}},{$group:{_id:{filetype:"$filetype",filesource:"$filesource"},"count":{"$sum":1}}}]).explain()
關(guān)于怎么進(jìn)行MONGODB 查詢就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文標(biāo)題:怎么進(jìn)行MONGODB查詢
文章路徑:http://jinyejixie.com/article30/ggehpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站導(dǎo)航、微信小程序、網(wǎng)站設(shè)計公司、小程序開發(fā)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)