Mongodb文檔和數(shù)組的通配符索引應用小結
學習mongodb,體會mongodb的每一個使用細節(jié),歡迎閱讀威贊的文章。這是威贊發(fā)布的第97篇mongodb技術文章,歡迎瀏覽本專欄威贊發(fā)布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關注威贊。謝謝。威贊文章都是結合官方文檔,翻譯整理而來,并對每個知識點的描述都認真思考和實踐,對難以理解的地方,使用簡單容易理解的方式進行闡述。
概述
Mongodb的通配符索引,為靈活可變的Mongodb數(shù)據(jù)結構提供了高效的查詢方法。本文結合Mongodb官方文檔,詳細介紹在嵌入式文檔和數(shù)組上,通配符索引的結構。
Mongodb為嵌入式文檔和數(shù)組字段建立通配符索引時,有特殊的邏輯:
- 當為文檔對象建立通配符索引時,Mongodb會掃描文檔對象的每一個字段,將文檔的每一個字段都加入到該通配符索引中。如果該字段值也是文檔對象,則繼續(xù)向下掃描,將該文檔類型的字段添加到通配符索引。當為數(shù)組對象建立通配符索引時, Mongodb會掃描數(shù)組中的每一個元素,將每一個元素的內(nèi)容添加到通配符索引。如果該元素是個數(shù)組,則將數(shù)組整體放入的通配符索引中。
- 當數(shù)組元素是對象時,則按照添加對象的方式,將該對象的每一個字段添加到通配符索引。
- 對于其他類型的字段,通配符索引保存基本的數(shù)據(jù)類型值。即非對象,非數(shù)組類型值。
通配符索引會持續(xù)轉換構建索引時遇到的嵌套文檔或數(shù)組,直到遇到基本數(shù)值為止。Mongodb將基本數(shù)值和該字段的路徑,都放入到通配符索引當中。
應用
為文檔對象建立通配符索引
構建集合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在構建通配符索引時,會解析account對象的每一個字段 ,將每一個字段的值和路徑放到索引中
- "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字段包含一個數(shù)組類型的字段coordinates, 字符類型的字段type, 數(shù)組類型的字段captains. 其中數(shù)組字段coordinates的元素也是數(shù)據(jù),在構建通配符索引時,直接將coordinates字段的數(shù)組放入索引當中。captains是文檔類型的數(shù)據(jù),Mongodb構建通配符索引時,會進一步解析到基本元素,將基本元素放入索引當中。按照這樣的規(guī)則 ,索引當中,存在下面的數(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"
從上面的例子當中可以看到,在構建索引時,并沒有把元素在數(shù)組中的位置也添加到索引當中。但mongdb也能夠使用通配符索引,支持帶有數(shù)組元素位置的查詢。如
db.fleet.find({"ship.captains.0.age": {$gt: 40}})查看該查詢的執(zhí)行計劃

但通配符索引,不支持下面的查詢
db.fleet.find({
"ship.coordinates.0.1": 37.786971
})查看執(zhí)行計劃,能夠看到使用全表掃描,而不是通配符索引。因為通配符索引將整個數(shù)組元素作為整體放倒索引數(shù)據(jù)中。而用戶使用數(shù)組當中的一個值來查詢時,Mongodb選擇了全表掃描。

Mongodb在構建通配符索引時,不會限制文檔數(shù)組類型結構的深度。但查詢時,如果路徑長度超過8, Mongodb會選擇其他更高效的索引或全表掃描的方式。
到此這篇關于Mongodb文檔和數(shù)組的通配符索引的文章就介紹到這了,更多相關Mongodb通配符索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
記一次MongoDB性能問題(從MySQL遷移到MongoDB)
最近忙著把一個項目從MySQL遷移到MongoDB,在導入舊數(shù)據(jù)的過程中,遇到了些許波折,犯了不少錯誤,但同時也學到了不少知識,遂記錄下來,需要的朋友可以參考下2017-03-03
MongoDB錯誤32-bit servers don''t have journaling enabled by de
這篇文章主要介紹了MongoDB錯誤32-bit servers don't have journaling enabled by default解決方法,需要的朋友可以參考下2014-10-10
mongodb如何對文檔內(nèi)數(shù)組進行過濾的方法步驟
這篇文章主要介紹了mongodb如何對文檔內(nèi)數(shù)組進行過濾的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
MongoDB數(shù)據(jù)庫與集合刪除操作方法詳解
MongoDB是一款開源的文檔型數(shù)據(jù)庫管理系統(tǒng),屬于非關系型數(shù)據(jù)庫范疇,這篇文章主要介紹了MongoDB數(shù)據(jù)庫與集合刪除操作方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-10-10
MongoDB磁盤空間占滿導致數(shù)據(jù)庫被鎖定的解決方法
我在實際項目中,遇到一個問題,隨著數(shù)據(jù)每天的不斷增加,導致mongodb的磁盤空間站滿了,數(shù)據(jù)庫被鎖了,無法使用,所以本文給大家介紹了清理MongoDB數(shù)據(jù)和磁盤空間的方法,需要的朋友可以參考下2024-04-04

