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