Mongodb文檔和數(shù)組的通配符索引應(yīng)用小結(jié)
學(xué)習(xí)mongodb,體會(huì)mongodb的每一個(gè)使用細(xì)節(jié),歡迎閱讀威贊的文章。這是威贊發(fā)布的第97篇mongodb技術(shù)文章,歡迎瀏覽本專(zhuān)欄威贊發(fā)布的其他文章。如果您認(rèn)為我的文章對(duì)您有幫助或者解決您的問(wèn)題,歡迎在文章下面點(diǎn)個(gè)贊,或者關(guān)注威贊。謝謝。威贊文章都是結(jié)合官方文檔,翻譯整理而來(lái),并對(duì)每個(gè)知識(shí)點(diǎn)的描述都認(rèn)真思考和實(shí)踐,對(duì)難以理解的地方,使用簡(jiǎn)單容易理解的方式進(jìn)行闡述。
概述
Mongodb的通配符索引,為靈活可變的Mongodb數(shù)據(jù)結(jié)構(gòu)提供了高效的查詢(xún)方法。本文結(jié)合Mongodb官方文檔,詳細(xì)介紹在嵌入式文檔和數(shù)組上,通配符索引的結(jié)構(gòu)。
Mongodb為嵌入式文檔和數(shù)組字段建立通配符索引時(shí),有特殊的邏輯:
- 當(dāng)為文檔對(duì)象建立通配符索引時(shí),Mongodb會(huì)掃描文檔對(duì)象的每一個(gè)字段,將文檔的每一個(gè)字段都加入到該通配符索引中。如果該字段值也是文檔對(duì)象,則繼續(xù)向下掃描,將該文檔類(lèi)型的字段添加到通配符索引。當(dāng)為數(shù)組對(duì)象建立通配符索引時(shí), Mongodb會(huì)掃描數(shù)組中的每一個(gè)元素,將每一個(gè)元素的內(nèi)容添加到通配符索引。如果該元素是個(gè)數(shù)組,則將數(shù)組整體放入的通配符索引中。
- 當(dāng)數(shù)組元素是對(duì)象時(shí),則按照添加對(duì)象的方式,將該對(duì)象的每一個(gè)字段添加到通配符索引。
- 對(duì)于其他類(lèi)型的字段,通配符索引保存基本的數(shù)據(jù)類(lèi)型值。即非對(duì)象,非數(shù)組類(lèi)型值。
通配符索引會(huì)持續(xù)轉(zhuǎn)換構(gòu)建索引時(shí)遇到的嵌套文檔或數(shù)組,直到遇到基本數(shù)值為止。Mongodb將基本數(shù)值和該字段的路徑,都放入到通配符索引當(dāng)中。
應(yīng)用
為文檔對(duì)象建立通配符索引
構(gòu)建集合users并插入數(shù)據(jù)
db.users.insertOne({ account: { user_name: "SuperAdmin01", contact: { email: "xyz@example.com", phone: "1234567890" }, access: { group: "admin" } } })
在account字段添加通配符索引
db.users.createIndex({"account.$**": 1})
Mongodb在構(gòu)建通配符索引時(shí),會(huì)解析account對(duì)象的每一個(gè)字段 ,將每一個(gè)字段的值和路徑放到索引中
- "account.username": "SuperAdmin01"
- "account.contact.email": "xyz@example.com"
- "account.contact.phone": "1234567890"
- "access.group": "admin"
為數(shù)組對(duì)象添加通配符索引
創(chuàng)建fleet集合并添加數(shù)據(jù)
db.fleet.insertOne({ ship: { coordinates: [ [ 37.786971, -122.399677 ], [ 37.786971, -122.399677 ] ], type: "Cargo Ship", captains: [ { name: "John Doe", age: 45, crew: [ "first mate", "engineer" ] } ] } })
為ship字段添加索引
db.fleet.createIndex({"ship.$**": 1})
ship字段包含一個(gè)數(shù)組類(lèi)型的字段coordinates, 字符類(lèi)型的字段type, 數(shù)組類(lèi)型的字段captains. 其中數(shù)組字段coordinates的元素也是數(shù)據(jù),在構(gòu)建通配符索引時(shí),直接將coordinates字段的數(shù)組放入索引當(dāng)中。captains是文檔類(lèi)型的數(shù)據(jù),Mongodb構(gòu)建通配符索引時(shí),會(huì)進(jìn)一步解析到基本元素,將基本元素放入索引當(dāng)中。按照這樣的規(guī)則 ,索引當(dāng)中,存在下面的數(shù)據(jù)
- "ship.coordinates":[37.786971, -122.399677 ],
- "ship.coordinates":[37.786971, -122.399677 ],
- "ship.type":"Cargo Ship",
- "ship.captains.name":"John Doe",
- "ship.captains.age":45,
- "ship.captains.crew":"first mate",
- "ship.captains.crew":"first engineer"
從上面的例子當(dāng)中可以看到,在構(gòu)建索引時(shí),并沒(méi)有把元素在數(shù)組中的位置也添加到索引當(dāng)中。但mongdb也能夠使用通配符索引,支持帶有數(shù)組元素位置的查詢(xún)。如
db.fleet.find({"ship.captains.0.age": {$gt: 40}})
查看該查詢(xún)的執(zhí)行計(jì)劃
但通配符索引,不支持下面的查詢(xún)
db.fleet.find({ "ship.coordinates.0.1": 37.786971 })
查看執(zhí)行計(jì)劃,能夠看到使用全表掃描,而不是通配符索引。因?yàn)橥ㄅ浞饕龑⒄麄€(gè)數(shù)組元素作為整體放倒索引數(shù)據(jù)中。而用戶使用數(shù)組當(dāng)中的一個(gè)值來(lái)查詢(xún)時(shí),Mongodb選擇了全表掃描。
Mongodb在構(gòu)建通配符索引時(shí),不會(huì)限制文檔數(shù)組類(lèi)型結(jié)構(gòu)的深度。但查詢(xún)時(shí),如果路徑長(zhǎng)度超過(guò)8, Mongodb會(huì)選擇其他更高效的索引或全表掃描的方式。
到此這篇關(guān)于Mongodb文檔和數(shù)組的通配符索引的文章就介紹到這了,更多相關(guān)Mongodb通配符索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mongoDB 多重?cái)?shù)組查詢(xún)(AngularJS綁定顯示 nodejs)
這篇文章主要介紹了mongoDB 多重?cái)?shù)組查詢(xún)(AngularJS綁定顯示 nodejs),需要的朋友可以參考下2017-06-06關(guān)于MongoDB謹(jǐn)防索引seek的效率問(wèn)題詳析
這篇文章主要給大家介紹了關(guān)于MongoDB謹(jǐn)防索引seek的效率問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法,文中以一個(gè)MongoDB實(shí)例為例,寫(xiě)了一個(gè)腳本來(lái)實(shí)現(xiàn)自動(dòng)分割MongoDB日志,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01MongoDB數(shù)據(jù)庫(kù)的日志文件深入分析
這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)日志的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MongoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09mongodb主從復(fù)制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了mongodb主從復(fù)制的相關(guān)資料,討論mongodb的部署技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Centos7安裝和卸載Mongodb數(shù)據(jù)庫(kù)的方法
MongoDB是一個(gè)跨平臺(tái),面向文檔的數(shù)據(jù)庫(kù),提供高性能,高可用性和易于擴(kuò)展。MongoDB是工作在集合和文檔上一種概念。下面通過(guò)本文給大家分享Centos7安裝和卸載Mongodb數(shù)據(jù)庫(kù)的方法,需要的朋友參考下吧2017-11-11